From d0c1c92f13ca95c8e5ae698e8cfbe83f702dba66 Mon Sep 17 00:00:00 2001 From: Glaydson Rodrigues Date: Mon, 23 Dec 2024 09:48:02 -0300 Subject: [PATCH] Release/4.0.0 (#757) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: modificar a estrutura atual para funcionamento de bibliotecas externas do PHP no projeto * feat: alterar url_base API para versões sei4, sei41, sei_super e Remover arquivo de ConfiguracaoModPEN.exemplo * feat: alterar o métodos da classe expedirProcedimento para funcionamento correto com REST * feat: alterar o métodos da classe PENAgendamento para funcionamento correto com REST * feat: alterar estrutura da classe ProcessoEletronicoINT para funcionamento correto com REST * refactor: substituir todas as rotas SOAP para REST * refactor: métodos de integração para recebimento de arquivos e geração de recibos * fix: mudar estrutura para se adaptar a mudança na API * chore: correções phpcs * fix: alterar estutura removendo parametro em obsoleto --dev * fix: alterar WSDL para REST no verificador de instalação e corrigir erro de merge * fix:: corrigir atualização no banco para proceessos recebidos * chore: adicionar camiinho absoluto para chamada do vendor dentro da class * feat: alterar tipagem de variável em todos os métodos que consome a API * fix: alterar nome historico no recebimento para teste funcional * fix: correções testes automatizados * fix: Adicionar correção documento cancelado, versões SEI: 4.1.1 e 4.1.2 * chore: aumentar timeout e remover número mágico --------- Co-authored-by: Glaydson Rodrigues --- Makefile | 12 +- src/composer.json | 0 src/composer.phar | 0 src/int/ProcessoEletronicoINT.php | 4 +- src/pen_map_unidade_cadastrar.php | 21 +- src/rn/EnviarReciboTramiteRN.php | 12 +- src/rn/ExpedirProcedimentoRN.php | 644 +++--- src/rn/PENAgendamentoRN.php | 17 +- src/rn/ProcessoEletronicoRN.php | 1950 ++++++++++------- src/rn/ReceberComponenteDigitalRN.php | 33 +- src/rn/ReceberProcedimentoRN.php | 100 +- src/rn/ReceberReciboTramiteRN.php | 3 +- src/rn/VerificadorInstalacaoRN.php | 16 +- .../config/ConfiguracaoModPEN.exemplo.php | 99 - .../assets/config/ConfiguracaoModPEN.php | 6 +- .../funcional/assets/config/composer.json | 18 + tests_sei4/funcional/bootstrap.php | 2 + tests_sei4/funcional/docker-compose.yml | 6 + .../PenMapUnidadesRestricaoFixture.php | 2 +- .../funcional/tests/CenarioBaseTestCase.php | 1 - ...ontendoDocumentoBeSimpleCorrompidoTest.php | 132 -- .../config/ConfiguracaoModPEN.exemplo.php | 99 - .../assets/config/ConfiguracaoModPEN.php | 6 +- .../funcional/assets/config/composer.json | 18 + tests_sei41/funcional/bootstrap.php | 2 + tests_sei41/funcional/docker-compose.yml | 6 + .../PenMapUnidadesRestricaoFixture.php | 2 +- .../funcional/tests/CenarioBaseTestCase.php | 1 - ...ontendoDocumentoBeSimpleCorrompidoTest.php | 132 -- .../config/ConfiguracaoModPEN.exemplo.php | 99 - .../assets/config/ConfiguracaoModPEN.php | 21 +- .../funcional/assets/config/composer.json | 18 + tests_super/funcional/bootstrap.php | 2 + tests_super/funcional/docker-compose.yml | 6 + .../PenMapUnidadesRestricaoFixture.php | 2 +- .../funcional/tests/CenarioBaseTestCase.php | 1 - ...ontendoDocumentoBeSimpleCorrompidoTest.php | 132 -- 37 files changed, 1713 insertions(+), 1912 deletions(-) create mode 100755 src/composer.json create mode 100755 src/composer.phar delete mode 100644 tests_sei4/funcional/assets/config/ConfiguracaoModPEN.exemplo.php create mode 100644 tests_sei4/funcional/assets/config/composer.json delete mode 100755 tests_sei4/funcional/tests/TramiteProcessoContendoDocumentoBeSimpleCorrompidoTest.php delete mode 100644 tests_sei41/funcional/assets/config/ConfiguracaoModPEN.exemplo.php create mode 100644 tests_sei41/funcional/assets/config/composer.json delete mode 100755 tests_sei41/funcional/tests/TramiteProcessoContendoDocumentoBeSimpleCorrompidoTest.php delete mode 100644 tests_super/funcional/assets/config/ConfiguracaoModPEN.exemplo.php mode change 100755 => 100644 tests_super/funcional/assets/config/ConfiguracaoModPEN.php create mode 100644 tests_super/funcional/assets/config/composer.json delete mode 100755 tests_super/funcional/tests/TramiteProcessoContendoDocumentoBeSimpleCorrompidoTest.php diff --git a/Makefile b/Makefile index 2d692f38a..50032fe69 100755 --- a/Makefile +++ b/Makefile @@ -144,6 +144,10 @@ install: check-isalive $(CMD_COMPOSE_FUNC) exec org1-http chown -R root:root /etc/cron.d/ $(CMD_COMPOSE_FUNC) exec org1-http chmod 0644 /etc/cron.d/sei $(CMD_COMPOSE_FUNC) exec org1-http chmod 0644 /etc/cron.d/sip + $(CMD_COMPOSE_FUNC) exec -w /opt/sei/web/modulos/pen org1-http bash -c './composer.phar update' + $(CMD_COMPOSE_FUNC) exec -w /opt/sei/web/modulos/pen org2-http bash -c './composer.phar update' + $(CMD_COMPOSE_FUNC) exec -w /opt/sei/web/modulos/pen org1-http bash -c './composer.phar install' + $(CMD_COMPOSE_FUNC) exec -w /opt/sei/web/modulos/pen org2-http bash -c './composer.phar install' $(CMD_COMPOSE_FUNC) exec -w /opt/sei/scripts/$(MODULO_PASTAS_CONFIG) org1-http bash -c "$(CMD_INSTALACAO_SEI_MODULO)" $(CMD_COMPOSE_FUNC) exec -w /opt/sip/scripts/$(MODULO_PASTAS_CONFIG) org1-http bash -c "$(CMD_INSTALACAO_SIP_MODULO)" @@ -153,10 +157,6 @@ install: check-isalive $(CMD_COMPOSE_FUNC) exec org2-http chmod 0644 /etc/cron.d/sip $(CMD_COMPOSE_FUNC) exec -w /opt/sei/scripts/$(MODULO_PASTAS_CONFIG) org2-http bash -c "$(CMD_INSTALACAO_SEI_MODULO)" $(CMD_COMPOSE_FUNC) exec -w /opt/sip/scripts/$(MODULO_PASTAS_CONFIG) org2-http bash -c "$(CMD_INSTALACAO_SIP_MODULO)" - - @if [ -e tests_$(sistema)/funcional/assets/config/ConfiguracaoModPEN.php ]; then rm tests_$(sistema)/funcional/assets/config/ConfiguracaoModPEN.php; fi; - @cp tests_$(sistema)/funcional/assets/config/ConfiguracaoModPEN.exemplo.php tests_$(sistema)/funcional/assets/config/ConfiguracaoModPEN.php - @echo "\nArquivo 'ConfiguracaoModPEN.php' restaurado conforme 'ConfiguracaoModPEN.exemplo.php'.\n"; wget -nc -i $(PEN_TEST_FUNC)/assets/arquivos/test_files_index.txt -P $(PEN_TEST_FUNC)/.tmp cp $(PEN_TEST_FUNC)/.tmp/* /tmp @@ -192,7 +192,7 @@ down: .env # make teste=TramiteProcessoComDevolucaoTest test-functional test-functional: .env $(FILE_VENDOR_FUNCIONAL) up vendor - $(CMD_COMPOSE_FUNC) run --rm php-test-functional /tests/vendor/bin/phpunit -c /tests/phpunit.xml /tests/tests/$(addsuffix .php,$(teste)) ; + $(CMD_COMPOSE_FUNC) run --rm php-test-functional /tests/vendor/bin/phpunit -c /tests/phpunit.xml $(textdox) /tests/tests/$(addsuffix .php,$(teste)) ; test-functional-parallel: .env $(FILE_VENDOR_FUNCIONAL) up @@ -204,7 +204,7 @@ test-parallel-otimizado: .env $(FILE_VENDOR_FUNCIONAL) up test-unit: $(FILE_VENDOR_UNITARIO) - $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml run --rm -w /tests php-test-unit bash -c 'vendor/bin/phpunit rn/ProcessoEletronicoRNTest.php' + $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml run --rm -w /tests php-test-unit bash -c 'vendor/bin/phpunit rn/$(addsuffix .php,$(teste))' test: test-unit test-functional diff --git a/src/composer.json b/src/composer.json new file mode 100755 index 000000000..e69de29bb diff --git a/src/composer.phar b/src/composer.phar new file mode 100755 index 000000000..e69de29bb diff --git a/src/int/ProcessoEletronicoINT.php b/src/int/ProcessoEletronicoINT.php index 62d58ceee..cf3a4bd4f 100755 --- a/src/int/ProcessoEletronicoINT.php +++ b/src/int/ProcessoEletronicoINT.php @@ -142,13 +142,13 @@ public static function formatarHierarquia($ObjEstrutura) if(isset($ObjEstrutura->hierarquia)) { - $arrObjNivel = $ObjEstrutura->hierarquia->nivel; + $arrObjNivel = $ObjEstrutura->hierarquia; $siglasUnidades = array(); $siglasUnidades[] = $ObjEstrutura->sigla; foreach($arrObjNivel as $key => $objNivel){ - $siglasUnidades[] = $objNivel->sigla ; + $siglasUnidades[] = $objNivel->sigla; } for($i = 1; $i <= 3; $i++){ diff --git a/src/pen_map_unidade_cadastrar.php b/src/pen_map_unidade_cadastrar.php index d76163131..ce03d4f84 100755 --- a/src/pen_map_unidade_cadastrar.php +++ b/src/pen_map_unidade_cadastrar.php @@ -104,10 +104,10 @@ $objInfraException->lancarValidacao('A unidade ' . $mapIdUnidade[$objResultado[0]->getNumIdUnidade()] .' do sistema já está mapeada com a unidade '.$_POST['txtUnidadePen'].' do Portal de Administração.'); } // CARREGAR NOME E SIGLA DA ESTRUTURA $objProcessoEletronico = new ProcessoEletronicoRN(); - $objProcessoEletronicoDTO = $objProcessoEletronico->listarEstruturas($numIdRepositorioOrigem, $_POST['id_unidade_rh']); + $objProcessoEletronicoDTO = $objProcessoEletronico->buscarEstrutura($numIdRepositorioOrigem, $_POST['id_unidade_rh']); - $nomeUnidadeRH = $objProcessoEletronicoDTO[0]->getStrNome(); - $siglaUnidadeRH = $objProcessoEletronicoDTO[0]->getStrSigla(); + $nomeUnidadeRH = $objProcessoEletronicoDTO->getStrNome(); + $siglaUnidadeRH = $objProcessoEletronicoDTO->getStrSigla(); $objPenUnidadeDTO = new PenUnidadeDTO(); $objPenUnidadeDTO->setNumIdUnidade($_POST['id_unidade']); $objPenUnidadeDTO->setNumIdUnidadeRH($_POST['id_unidade_rh']); @@ -183,18 +183,19 @@ $objUnidadeDTO->retStrDescricao(); $arrMapIdUnidade = array(); $objPenUnidadeRN = new PenUnidadeRN(); - foreach ($objPenUnidadeRN->listar($objUnidadeDTO) as $dados) { - $arrMapIdUnidade[$dados->getNumIdUnidade()] = $dados->getStrSigla() . ' - ' . $dados->getStrDescricao(); - } + foreach ($objPenUnidadeRN->listar($objUnidadeDTO) as $dados) { + $arrMapIdUnidade[$dados->getNumIdUnidade()] = $dados->getStrSigla() . ' - ' . $dados->getStrDescricao(); + } //Verifica se o numero da unidade esta vazio, senão estiver busca o nome da unidade para exibição $strNomeUnidadeSelecionada = ''; if(!empty($objPenUnidadeDTO->getNumIdUnidadeRH())){ - $objProcessoEletronico = new ProcessoEletronicoRN(); - $objProcessoEletronicoDTO = $objProcessoEletronico->listarEstruturas($numIdRepositorioOrigem, $objPenUnidadeDTO->getNumIdUnidadeRH()); - if(!is_null($objProcessoEletronicoDTO[0])){ - $strNomeUnidadeSelecionada = $objProcessoEletronicoDTO[0]->getStrNome(); + $objProcessoEletronico = new ProcessoEletronicoRN(); + $objProcessoEletronicoDTO = $objProcessoEletronico->buscarEstrutura($numIdRepositorioOrigem, $objPenUnidadeDTO->getNumIdUnidadeRH()); + + if(!is_null($objProcessoEletronicoDTO)){ + $strNomeUnidadeSelecionada = $objProcessoEletronicoDTO->getStrNome(); }else{ $strNomeUnidadeSelecionada = 'Unidade não encontrada.'; } diff --git a/src/rn/EnviarReciboTramiteRN.php b/src/rn/EnviarReciboTramiteRN.php index 29a8efcd4..7d4ad46b6 100755 --- a/src/rn/EnviarReciboTramiteRN.php +++ b/src/rn/EnviarReciboTramiteRN.php @@ -37,7 +37,7 @@ protected function gerarReciboTramite($numIdTramite){ $objMetaProcesso = $objMetaRetorno->metadados->processo; - $arrObjMetaDocumento = is_array($objMetaProcesso->documento) ? $objMetaProcesso->documento : array($objMetaProcesso->documento); + $arrObjMetaDocumento = is_array($objMetaProcesso->documentos) ? $objMetaProcesso->documentos : array($objMetaProcesso->documentos); $objDTO = new ComponenteDigitalDTO(); $objBD = new ComponenteDigitalBD($this->inicializarObjInfraIBanco()); @@ -152,13 +152,13 @@ private function obterDataRecebimentoComponentesDigitais($parObjTramite){ throw new InfraException('Parâmetro $parObjTramite não informado.'); } - if(!is_array($parObjTramite->historico->operacao)) { - $parObjTramite->historico->operacao = array($parObjTramite->historico->operacao); + if(!is_array($parObjTramite->itensHistorico->operacao)) { + $parObjTramite->itensHistorico->operacao = array($parObjTramite->itensHistorico->operacao); } - foreach ($parObjTramite->historico->operacao as $operacao) { - if($operacao->situacao == ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_COMPONENTES_RECEBIDOS_DESTINATARIO) { - return ProcessoEletronicoRN::converterDataSEI($operacao->dataHora); + foreach ($parObjTramite->itensHistorico->operacao as $operacao) { + if($operacao['situacao'] == ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_COMPONENTES_RECEBIDOS_DESTINATARIO) { + return ProcessoEletronicoRN::converterDataSEI($operacao['dataHora']); } } diff --git a/src/rn/ExpedirProcedimentoRN.php b/src/rn/ExpedirProcedimentoRN.php index 5f889b7c9..3c1bb807b 100755 --- a/src/rn/ExpedirProcedimentoRN.php +++ b/src/rn/ExpedirProcedimentoRN.php @@ -122,17 +122,17 @@ private function gravarLogDebug($parStrMensagem, $parNumIdentacao = 0, $parBolLo protected function expedirProcedimentoControlado(ExpedirProcedimentoDTO $objExpedirProcedimentoDTO) { - $numIdTramite = 0; + $numIdTramite = 0; try { - //Valida Permissão - SessaoSEI::getInstance()->validarAuditarPermissao('pen_procedimento_expedir', __METHOD__, $objExpedirProcedimentoDTO); - $dblIdProcedimento = $objExpedirProcedimentoDTO->getDblIdProcedimento(); + //Valida Permissão + SessaoSEI::getInstance()->validarAuditarPermissao('pen_procedimento_expedir', __METHOD__, $objExpedirProcedimentoDTO); + $dblIdProcedimento = $objExpedirProcedimentoDTO->getDblIdProcedimento(); - $objPenBlocoProcessoRN = new PenBlocoProcessoRN(); - $bolSinProcessamentoEmBloco = $objExpedirProcedimentoDTO->getBolSinProcessamentoEmBloco(); - $numIdBloco = $objExpedirProcedimentoDTO->getNumIdBloco(); - $numIdAtividade = $objExpedirProcedimentoDTO->getNumIdAtividade(); - $numIdUnidade = $objExpedirProcedimentoDTO->getNumIdUnidade(); + $objPenBlocoProcessoRN = new PenBlocoProcessoRN(); + $bolSinProcessamentoEmBloco = $objExpedirProcedimentoDTO->getBolSinProcessamentoEmBloco(); + $numIdBloco = $objExpedirProcedimentoDTO->getNumIdBloco(); + $numIdAtividade = $objExpedirProcedimentoDTO->getNumIdAtividade(); + $numIdUnidade = $objExpedirProcedimentoDTO->getNumIdUnidade(); if(!$bolSinProcessamentoEmBloco){ $this->barraProgresso->exibir(); @@ -201,10 +201,10 @@ protected function expedirProcedimentoControlado(ExpedirProcedimentoDTO $objExpe $objCabecalho = $this->construirCabecalho($objExpedirProcedimentoDTO, $strNumeroRegistro, $dblIdProcedimento); //Construção do processo para envio - $objProcesso = $this->construirProcesso($dblIdProcedimento, $objExpedirProcedimentoDTO->getArrIdProcessoApensado(), $objMetadadosProcessoTramiteAnterior); + $arrProcesso = $this->construirProcessoREST($dblIdProcedimento, $objExpedirProcedimentoDTO->getArrIdProcessoApensado(), $objMetadadosProcessoTramiteAnterior); //Obtém o tamanho total da barra de progreso - $nrTamanhoTotalBarraProgresso = $this->obterTamanhoTotalDaBarraDeProgresso($objProcesso); + $nrTamanhoTotalBarraProgresso = $this->obterTamanhoTotalDaBarraDeProgressoREST($arrProcesso); if(!$bolSinProcessamentoEmBloco){ //Atribui o tamanho máximo da barra de progresso @@ -223,52 +223,55 @@ protected function expedirProcedimentoControlado(ExpedirProcedimentoDTO $objExpe $this->objProcessoEletronicoRN->cancelarTramite($objTramiteInconsistente->IDT); } - $param = new stdClass(); - $param->novoTramiteDeProcesso = new stdClass(); - $param->novoTramiteDeProcesso->cabecalho = $objCabecalho; - $param->novoTramiteDeProcesso->processo = $objProcesso; - $param->dblIdProcedimento = $dblIdProcedimento; - $novoTramite = $this->objProcessoEletronicoRN->enviarProcesso($param); + $param = [ + 'novoTramiteDeProcesso' => [ + 'cabecalho' => $objCabecalho, + 'processo' => $arrProcesso + ], + 'dblIdProcedimento' => $dblIdProcedimento + ]; + + $novoTramite = $this->objProcessoEletronicoRN->enviarProcessoREST($param); - $numIdTramite = $novoTramite->dadosTramiteDeProcessoCriado->IDT; + $numIdTramite = $novoTramite['IDT']; $this->lancarEventoEnvioMetadados($numIdTramite); $this->atualizarPenProtocolo($dblIdProcedimento); - if (isset($novoTramite->dadosTramiteDeProcessoCriado)) { - $objTramite = $novoTramite->dadosTramiteDeProcessoCriado; - $this->objProcedimentoAndamentoRN->setOpts($objTramite->NRE, $objTramite->IDT, ProcessoEletronicoRN::obterIdTarefaModulo(ProcessoEletronicoRN::$TI_PROCESSO_ELETRONICO_PROCESSO_EXPEDIDO), $dblIdProcedimento); + if (isset($novoTramite)) { + $objTramite = $novoTramite; + $this->objProcedimentoAndamentoRN->setOpts($objTramite['NRE'], $objTramite['IDT'], ProcessoEletronicoRN::obterIdTarefaModulo(ProcessoEletronicoRN::$TI_PROCESSO_ELETRONICO_PROCESSO_EXPEDIDO), $dblIdProcedimento); - try { + try { $this->objProcedimentoAndamentoRN->cadastrar(ProcedimentoAndamentoDTO::criarAndamento('Envio do metadados do processo', 'S')); - if($bolSinProcessamentoEmBloco){ - $this->gravarLogDebug(sprintf('Envio do metadados do processo %s', $objProcedimentoDTO->getStrProtocoloProcedimentoFormatado()), 2); - $objPenBlocoProcessoDTO->setNumIdAndamento(ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_INICIADO); - $objPenBlocoProcessoRN->alterar($objPenBlocoProcessoDTO); - $idAtividadeExpedicao = $numIdAtividade; - }else{ - $idAtividadeExpedicao = $this->bloquearProcedimentoExpedicao($objExpedirProcedimentoDTO, $objProcesso->idProcedimentoSEI); - } + if($bolSinProcessamentoEmBloco){ + $this->gravarLogDebug(sprintf('Envio do metadados do processo %s', $objProcedimentoDTO->getStrProtocoloProcedimentoFormatado()), 2); + $objPenBlocoProcessoDTO->setNumIdAndamento(ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_INICIADO); + $objPenBlocoProcessoRN->alterar($objPenBlocoProcessoDTO); + $idAtividadeExpedicao = $numIdAtividade; + }else{ + $idAtividadeExpedicao = $this->bloquearProcedimentoExpedicao($objExpedirProcedimentoDTO, $arrProcesso['idProcedimentoSEI']); + } $this->objProcessoEletronicoRN->cadastrarTramiteDeProcesso( - $objProcesso->idProcedimentoSEI, - $objTramite->NRE, - $objTramite->IDT, + $arrProcesso['idProcedimentoSEI'], + $objTramite['NRE'], + $objTramite['IDT'], ProcessoEletronicoRN::$STA_TIPO_TRAMITE_ENVIO, - $objTramite->dataHoraDeRegistroDoTramite, + $objTramite['dataHoraDeRegistroDoTramite'], $objExpedirProcedimentoDTO->getNumIdRepositorioOrigem(), $objExpedirProcedimentoDTO->getNumIdUnidadeOrigem(), $objExpedirProcedimentoDTO->getNumIdRepositorioDestino(), $objExpedirProcedimentoDTO->getNumIdUnidadeDestino(), - $objProcesso, - $objTramite->ticketParaEnvioDeComponentesDigitais, - $objTramite->componentesDigitaisSolicitados, + $arrProcesso, + $objTramite['ticketParaEnvioDeComponentesDigitais'], + $objTramite['processosComComponentesDigitaisSolicitados'], $bolSinProcessamentoEmBloco, $numIdUnidade); - $this->objProcessoEletronicoRN->cadastrarTramitePendente($objTramite->IDT, $idAtividadeExpedicao); + $this->objProcessoEletronicoRN->cadastrarTramitePendente($objTramite['IDT'], $idAtividadeExpedicao); //TODO: Erro no BARRAMENTO: Processo no pode ser enviado se possuir 2 documentos iguais(mesmo hash) //TODO: Melhoria no barramento de servios. O mtodo solicitar metadados no deixa claro quais os componentes digitais que @@ -277,7 +280,7 @@ protected function expedirProcedimentoControlado(ExpedirProcedimentoDTO $objExpe //componentes precisam ser baixados, semelhante ao que ocorre no enviarProcesso onde o barramento informa quais os componentes //que precisam ser enviados - $this->enviarComponentesDigitais($objTramite->NRE, $objTramite->IDT, $objProcesso->protocolo, $bolSinProcessamentoEmBloco); + $this->enviarComponentesDigitais($objTramite['NRE'], $objTramite['IDT'], $arrProcesso['protocolo'], $bolSinProcessamentoEmBloco); //TODO: Ao enviar o processo e seus documentos, necessrio bloquear os documentos para alterao //pois eles j foram visualizados @@ -289,41 +292,41 @@ protected function expedirProcedimentoControlado(ExpedirProcedimentoDTO $objExpe //TODO: Alterar atualizao para somente apresentar ao final de todo o trâmite //$this->barraProgresso->mover(ProcessoEletronicoINT::NEE_EXPEDICAO_ETAPA_CONCLUSAO); - if(!$bolSinProcessamentoEmBloco){ - $this->barraProgresso->mover($this->barraProgresso->getNumMax()); - $this->barraProgresso->setStrRotulo(ProcessoEletronicoINT::TEE_EXPEDICAO_ETAPA_CONCLUSAO); - }else{ - $this->gravarLogDebug('Concluído envio dos componentes do processo', 2); - $objPenBlocoProcessoDTO->setNumIdAndamento(ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_COMPONENTES_ENVIADOS_REMETENTE); - $objPenBlocoProcessoRN->alterar($objPenBlocoProcessoDTO); - } + if(!$bolSinProcessamentoEmBloco){ + $this->barraProgresso->mover($this->barraProgresso->getNumMax()); + $this->barraProgresso->setStrRotulo(ProcessoEletronicoINT::TEE_EXPEDICAO_ETAPA_CONCLUSAO); + }else{ + $this->gravarLogDebug('Concluído envio dos componentes do processo', 2); + $objPenBlocoProcessoDTO->setNumIdAndamento(ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_COMPONENTES_ENVIADOS_REMETENTE); + $objPenBlocoProcessoRN->alterar($objPenBlocoProcessoDTO); + } $this->objProcedimentoAndamentoRN->cadastrar(ProcedimentoAndamentoDTO::criarAndamento('Concluído envio dos componentes do processo', 'S')); - $this->receberReciboDeEnvio($objTramite->IDT); + $this->receberReciboDeEnvio($objTramite['IDT']); $this->gravarLogDebug(sprintf('Trâmite do processo %s foi concluído', $objProcedimentoDTO->getStrProtocoloProcedimentoFormatado()), 2); $numTempoTotalRecebimento = round(microtime(true) - $numTempoInicialRecebimento, 2); $this->gravarLogDebug("Finalizado o envio de protocolo número " . $objProcedimentoDTO->getStrProtocoloProcedimentoFormatado() . " (Tempo total: {$numTempoTotalRecebimento}s)", 0, true); - } - catch (\Exception $e) { - //Realiza o desbloqueio do processo - try{ $this->desbloquearProcessoExpedicao($objProcesso->idProcedimentoSEI); } catch (Exception $ex) { } - - //Realiza o cancelamento do tramite - try{ - if($numIdTramite != 0){ - $this->objProcessoEletronicoRN->cancelarTramite($numIdTramite); - } - } catch (InfraException $ex) { } + } + catch (\Exception $e) { + //Realiza o desbloqueio do processo + try{ $this->desbloquearProcessoExpedicao($arrProcesso['idProcedimentoSEI']); } catch (Exception $ex) { } + + //Realiza o cancelamento do tramite + try{ + if($numIdTramite != 0){ + $this->objProcessoEletronicoRN->cancelarTramite($numIdTramite); + } + } catch (InfraException $ex) { } - $this->registrarAndamentoExpedicaoAbortada($objProcesso->idProcedimentoSEI); + $this->registrarAndamentoExpedicaoAbortada($arrProcesso['idProcedimentoSEI']); $this->objProcedimentoAndamentoRN->cadastrar(ProcedimentoAndamentoDTO::criarAndamento('Concluído envio dos componentes do processo', 'N')); throw $e; + } } - } } catch (\Exception $e) { $this->gravarLogDebug("Erro processando envio de processo: $e", 0, true); @@ -383,33 +386,34 @@ private function consultarMetadadosPEN($parDblIdProcedimento) * @param $parObjProcesso * @return float|int $totalBarraProgresso */ - private function obterTamanhoTotalDaBarraDeProgresso($parObjProcesso) { - $nrTamanhoMegasMaximo = ProcessoEletronicoRN::obterTamanhoBlocoTransferencia(); - $nrTamanhoBytesMaximo = ($nrTamanhoMegasMaximo * pow(1024, 2)); //Qtd de MB definido como parametro + private function obterTamanhoTotalDaBarraDeProgressoREST($parObjProcesso) { - $totalBarraProgresso = 2; - $this->contadorDaBarraDeProgresso = 2; - $arrHashIndexados = array(); - foreach ($parObjProcesso->documento as $objDoc) - { - $arrComponentesDigitais = is_array($objDoc->componenteDigital) ? $objDoc->componenteDigital : array($objDoc->componenteDigital); + $nrTamanhoMegasMaximo = ProcessoEletronicoRN::obterTamanhoBlocoTransferencia(); + $nrTamanhoBytesMaximo = ($nrTamanhoMegasMaximo * pow(1024, 2)); //Qtd de MB definido como parametro + + $totalBarraProgresso = 2; + $this->contadorDaBarraDeProgresso = 2; + $arrHashIndexados = array(); + foreach ($parObjProcesso['documentos'] as $objDoc) + { + $arrComponentesDigitais = is_array($objDoc['componentesDigitais']) ? $objDoc['componentesDigitais'] : array($objDoc['componentesDigitais']); foreach ($arrComponentesDigitais as $objComponenteDigital) { - $strHashComponente = ProcessoEletronicoRN::getHashFromMetaDados($objComponenteDigital->hash); + $strHashComponente = ProcessoEletronicoRN::getHashFromMetaDadosREST($objComponenteDigital['hash']); if(!in_array($strHashComponente, $arrHashIndexados)){ - $arrHashIndexados[] = $strHashComponente; - $nrTamanhoComponente = $objComponenteDigital->tamanhoEmBytes; + $arrHashIndexados[] = $strHashComponente; + $nrTamanhoComponente = $objComponenteDigital['tamanhoEmBytes']; if($nrTamanhoComponente > $nrTamanhoBytesMaximo){ $qtdPartes = ceil($nrTamanhoComponente / $nrTamanhoBytesMaximo); $totalBarraProgresso += $qtdPartes; continue; } - $totalBarraProgresso++; + $totalBarraProgresso++; } } } - return $totalBarraProgresso; + return $totalBarraProgresso; } public function listarRepositoriosDeEstruturas() @@ -488,41 +492,53 @@ private function enviarApenasComponentesDigitaisPendentes($numIdRepositorioDesti return false; } - private function construirProcesso($dblIdProcedimento, $arrIdProcessoApensado = null, $parObjMetadadosTramiteAnterior = null) - { + public function construirProcessoREST($dblIdProcedimento, $arrIdProcessoApensado = null, $parObjMetadadosTramiteAnterior = null) + { if(!isset($dblIdProcedimento)){ throw new InfraException('Parâmetro $dblIdProcedimento não informado.'); } + $objProcedimentoDTO = $this->consultarProcedimento($dblIdProcedimento); $objPenRelHipoteseLegalRN = new PenRelHipoteseLegalEnvioRN(); - $objProcesso = new stdClass(); - $objProcesso->staTipoProtocolo = ProcessoEletronicoRN::$STA_TIPO_PROTOCOLO_PROCESSO; - $objProcesso->protocolo = mb_convert_encoding($objProcedimentoDTO->getStrProtocoloProcedimentoFormatado(), 'UTF-8', 'ISO-8859-1'); - $objProcesso->nivelDeSigilo = $this->obterNivelSigiloPEN($objProcedimentoDTO->getStrStaNivelAcessoLocalProtocolo()); - $objProcesso->processoDeNegocio = mb_convert_encoding($this->objProcessoEletronicoRN->reduzirCampoTexto($objProcedimentoDTO->getStrNomeTipoProcedimento(), 100), 'UTF-8', 'ISO-8859-1'); - $objProcesso->descricao = mb_convert_encoding($this->objProcessoEletronicoRN->reduzirCampoTexto($objProcedimentoDTO->getStrDescricaoProtocolo(), 100), 'UTF-8', 'ISO-8859-1'); - $objProcesso->dataHoraDeProducao = $this->objProcessoEletronicoRN->converterDataWebService($objProcedimentoDTO->getDtaGeracaoProtocolo()); - if($objProcedimentoDTO->getStrStaNivelAcessoLocalProtocolo() == ProtocoloRN::$NA_RESTRITO){ - $objProcesso->hipoteseLegal = new stdClass(); - $objProcesso->hipoteseLegal->identificacao = $objPenRelHipoteseLegalRN->getIdHipoteseLegalPEN($objProcedimentoDTO->getNumIdHipoteseLegalProtocolo()); - } - - $this->atribuirProdutorProcesso($objProcesso, $objProcedimentoDTO->getNumIdUsuarioGeradorProtocolo(), $objProcedimentoDTO->getNumIdUnidadeGeradoraProtocolo()); - $this->atribuirDataHoraDeRegistro($objProcesso, $objProcedimentoDTO->getDblIdProcedimento()); - $this->atribuirDocumentos($objProcesso, $dblIdProcedimento, $parObjMetadadosTramiteAnterior); - $this->atribuirDadosInteressados($objProcesso, $dblIdProcedimento); - $this->adicionarProcessosApensados($objProcesso, $arrIdProcessoApensado); - $this->atribuirDadosHistorico($objProcesso, $dblIdProcedimento); - - $objProcesso->idProcedimentoSEI = $dblIdProcedimento; + $objProcesso = [ + 'staTipoProtocolo' => ProcessoEletronicoRN::$STA_TIPO_PROTOCOLO_PROCESSO, + 'protocolo' => mb_convert_encoding($objProcedimentoDTO->getStrProtocoloProcedimentoFormatado(), 'UTF-8', 'ISO-8859-1'), + 'nivelDeSigilo' => $this->obterNivelSigiloPEN($objProcedimentoDTO->getStrStaNivelAcessoLocalProtocolo()), + 'processoDeNegocio' => mb_convert_encoding($this->objProcessoEletronicoRN->reduzirCampoTexto($objProcedimentoDTO->getStrNomeTipoProcedimento(), 100), 'UTF-8', 'ISO-8859-1'), + 'descricao' => mb_convert_encoding($this->objProcessoEletronicoRN->reduzirCampoTexto($objProcedimentoDTO->getStrDescricaoProtocolo(), 100), 'UTF-8', 'ISO-8859-1' ), + 'dataHoraDeProducao' => $this->objProcessoEletronicoRN->converterDataWebService($objProcedimentoDTO->getDtaGeracaoProtocolo()) + ]; + + + + if ($objProcedimentoDTO->getStrStaNivelAcessoLocalProtocolo() == ProtocoloRN::$NA_RESTRITO) { + $objProcesso['hipoteseLegal'] = [ + 'identificacao' => $objPenRelHipoteseLegalRN->getIdHipoteseLegalPEN($objProcedimentoDTO->getNumIdHipoteseLegalProtocolo()) + ]; + } + + $objProcesso = $this->atribuirProdutorProcessoREST($objProcesso, $objProcedimentoDTO->getNumIdUsuarioGeradorProtocolo(), $objProcedimentoDTO->getNumIdUnidadeGeradoraProtocolo()); + + $objProcesso = $this->atribuirDataHoraDeRegistroREST($objProcesso, $objProcedimentoDTO->getDblIdProcedimento()); + + $objProcesso = $this->atribuirDocumentosREST($objProcesso, $dblIdProcedimento, $parObjMetadadosTramiteAnterior); + + $objProcesso = $this->atribuirDadosInteressadosREST($objProcesso, $dblIdProcedimento); + + $objProcesso = $this->adicionarProcessosApensadosREST($objProcesso, $arrIdProcessoApensado); + + $objProcesso = $this->atribuirDadosHistoricoREST($objProcesso, $dblIdProcedimento); + + $objProcesso['idProcedimentoSEI'] = $dblIdProcedimento; return $objProcesso; } + //TODO: Implementar mapeamento de atividades que sero enviadas para barramento (semelhante Protocolo Integrado) - private function atribuirDadosHistorico($objProcesso, $dblIdProcedimento) - { + private function atribuirDadosHistoricoREST($objProcesso, $dblIdProcedimento) + { $objProcedimentoHistoricoDTO = new ProcedimentoHistoricoDTO(); $objProcedimentoHistoricoDTO->setDblIdProcedimento($dblIdProcedimento); $objProcedimentoHistoricoDTO->setStrStaHistorico(ProcedimentoRN::$TH_TOTAL); @@ -533,27 +549,31 @@ private function atribuirDadosHistorico($objProcesso, $dblIdProcedimento) $arrObjAtividadeDTO = $objProcedimentoDTO->getArrObjAtividadeDTO(); if($arrObjAtividadeDTO == null || count($arrObjAtividadeDTO) == 0) { - throw new InfraException("Não foi possível obter andamentos do processo {$objProcesso->protocolo}"); + throw new InfraException("Não foi possível obter andamentos do processo {$objProcesso['protocolo']}"); } $arrObjOperacao = array(); foreach ($arrObjAtividadeDTO as $objAtividadeDTO) { - $objOperacao = new stdClass(); - $objOperacao->dataHoraOperacao = $this->objProcessoEletronicoRN->converterDataWebService($objAtividadeDTO->getDthAbertura()); - $objOperacao->unidadeOperacao = $objAtividadeDTO->getStrDescricaoUnidade()?mb_convert_encoding($objAtividadeDTO->getStrDescricaoUnidade(), 'UTF-8', 'ISO-8859-1'):"NA"; - $objOperacao->operacao = $objAtividadeDTO->getStrNomeTarefa()?$this->objProcessoEletronicoRN->reduzirCampoTexto(strip_tags(mb_convert_encoding($objAtividadeDTO->getStrNomeTarefa(), 'UTF-8', 'ISO-8859-1')), 1000):"NA"; - $objOperacao->usuario = $objAtividadeDTO->getStrNomeUsuarioOrigem()?mb_convert_encoding($objAtividadeDTO->getStrNomeUsuarioOrigem(), 'UTF-8', 'ISO-8859-1'):"NA"; + $objOperacao = [ + 'dataHoraOperacao' => $this->objProcessoEletronicoRN->converterDataWebService($objAtividadeDTO->getDthAbertura()), + 'unidadeOperacao' => $objAtividadeDTO->getStrDescricaoUnidade() ? mb_convert_encoding($objAtividadeDTO->getStrDescricaoUnidade(), 'UTF-8', 'ISO-8859-1') : "NA", + 'operacao' => $objAtividadeDTO->getStrNomeTarefa() ? $this->objProcessoEletronicoRN->reduzirCampoTexto(strip_tags(mb_convert_encoding($objAtividadeDTO->getStrNomeTarefa(), 'UTF-8', 'ISO-8859-1')), 1000) : "NA", + 'usuario' => $objAtividadeDTO->getStrNomeUsuarioOrigem() ? mb_convert_encoding($objAtividadeDTO->getStrNomeUsuarioOrigem(), 'UTF-8', 'ISO-8859-1') : "NA" + ]; + $arrObjOperacao[] = $objOperacao; } - usort($arrObjOperacao, function($obj1, $obj2){ - $dt1=new DateTime($obj1->dataHoraOperacao); - $dt2=new DateTime($obj2->dataHoraOperacao); - return $dt1>$dt2; + usort($arrObjOperacao, function($obj1, $obj2) { + $dt1 = new DateTime($obj1['dataHoraOperacao']); + $dt2 = new DateTime($obj2['dataHoraOperacao']); + return $dt1 > $dt2; }); - $objProcesso->historico = $arrObjOperacao; + $objProcesso['itensHistorico'] = $arrObjOperacao; + + return $objProcesso; } /** @@ -748,14 +768,14 @@ public static function receberRecusaProcedimento($motivo, $unidade_destino, $idP } } - private function atribuirDataHoraDeRegistro($objContexto, $dblIdProcedimento, $dblIdDocumento = null) - { - //Validar parâmetro $objContexto + private function atribuirDataHoraDeRegistroREST($objContexto, $dblIdProcedimento, $dblIdDocumento = null) + { + //Validar parâmetro $objContexto if(!isset($objContexto)) { throw new InfraException('Parâmetro $objContexto não informado.'); } - //Validar parâmetro $dbIdProcedimento + //Validar parâmetro $dbIdProcedimento if(!isset($dblIdProcedimento)) { throw new InfraException('Parâmetro $dbIdProcedimento não informado.'); } @@ -777,57 +797,71 @@ private function atribuirDataHoraDeRegistro($objContexto, $dblIdProcedimento, $d $arrObjAtividadeDTOHistorico = $objProcedimentoDTOHistorico->getArrObjAtividadeDTO(); if(isset($arrObjAtividadeDTOHistorico) && count($arrObjAtividadeDTOHistorico) == 1){ - $objContexto->dataHoraDeRegistro = $this->objProcessoEletronicoRN->converterDataWebService($arrObjAtividadeDTOHistorico[0]->getDthAbertura()); + $objContexto['dataHoraDeRegistro'] = $this->objProcessoEletronicoRN->converterDataWebService($arrObjAtividadeDTOHistorico[0]->getDthAbertura()); } - } - private function atribuirProdutorProcesso($objProcesso, $dblIdProcedimento, $numIdUnidadeGeradora) + return $objContexto; + } + + private function atribuirProdutorProcessoREST($objProcesso, $dblIdProcedimento, $numIdUnidadeGeradora) { if(!isset($objProcesso)){ throw new InfraException('Parâmetro $objProcesso não informado.'); } - $objProcesso->produtor = new stdClass(); $objUsuarioProdutor = $this->consultarUsuario($dblIdProcedimento); - if(isset($objUsuarioProdutor)) { - //Dados do produtor do processo - $objProcesso->produtor->nome = mb_convert_encoding($this->objProcessoEletronicoRN->reduzirCampoTexto($objUsuarioProdutor->getStrNome(), 150), 'UTF-8', 'ISO-8859-1'); - //TODO: Obter tipo de pessoa física dos contatos do SEI - $objProcesso->produtor->numeroDeIdentificacao = $objUsuarioProdutor->getDblCpfContato(); - $objProcesso->produtor->tipo = self::STA_TIPO_PESSOA_FISICA; - //TODO: Informar dados da estrutura organizacional (estruturaOrganizacional) + if (isset($objUsuarioProdutor)) { + // Dados do produtor do processo + $objProcesso['produtor'] = [ + 'nome' => mb_convert_encoding($this->objProcessoEletronicoRN->reduzirCampoTexto($objUsuarioProdutor->getStrNome(), 150), 'UTF-8', 'ISO-8859-1'), + 'tipo' => self::STA_TIPO_PESSOA_FISICA + ]; + + if ($objUsuarioProdutor->getDblCpfContato()) { + $objProcesso['produtor']['numeroDeIdentificacao'] = $objUsuarioProdutor->getDblCpfContato(); + } + // TODO: Informar dados da estrutura organizacional (estruturaOrganizacional) } - + $objUnidadeGeradora = $this->consultarUnidade($dblIdProcedimento); - if(isset($objUnidadeGeradora)){ - $objProcesso->produtor->unidade = new stdClass(); - $objProcesso->produtor->unidade->nome = mb_convert_encoding($this->objProcessoEletronicoRN->reduzirCampoTexto($objUnidadeGeradora->getStrDescricao(), 150), 'UTF-8', 'ISO-8859-1'); - $objProcesso->produtor->unidade->tipo = self::STA_TIPO_PESSOA_ORGAOPUBLICO; - //TODO: Informar dados da estrutura organizacional (estruturaOrganizacional) + if (isset($objUnidadeGeradora)) { + $objProcesso['produtor']['unidade'] = [ + 'nome' => mb_convert_encoding($this->objProcessoEletronicoRN->reduzirCampoTexto($objUnidadeGeradora->getStrDescricao(), 150), 'UTF-8', 'ISO-8859-1'), + 'tipo' => self::STA_TIPO_PESSOA_ORGAOPUBLICO + ]; + // TODO: Informar dados da estrutura organizacional (estruturaOrganizacional) } + + return $objProcesso; } - private function atribuirDadosInteressados($objProcesso, $dblIdProcedimento) - { - if(!isset($objProcesso)){ + + private function atribuirDadosInteressadosREST($objProcesso, $dblIdProcedimento) + { + if (!isset($objProcesso)) { throw new InfraException('Parâmetro $objProcesso não informado.'); } - + $arrParticipantesDTO = $this->listarInteressados($dblIdProcedimento); - - if(isset($arrParticipantesDTO) && count($arrParticipantesDTO) > 0){ - $objProcesso->interessado = array(); - + + if (isset($arrParticipantesDTO) && count($arrParticipantesDTO) > 0) { + $objProcesso['interessados'] = array(); + foreach ($arrParticipantesDTO as $participanteDTO) { - $interessado = new stdClass(); - $interessado->nome = mb_convert_encoding($this->objProcessoEletronicoRN->reduzirCampoTexto($participanteDTO->getStrNomeContato(), 150), 'UTF-8', 'ISO-8859-1'); - $objProcesso->interessado[] = $interessado; + $interessado = [ + 'nome' => mb_convert_encoding($this->objProcessoEletronicoRN->reduzirCampoTexto($participanteDTO->getStrNomeContato(), 150), 'UTF-8', 'ISO-8859-1') + ]; + $objProcesso['interessados'][] = $interessado; } - } + } + + return $objProcesso; } - private function atribuirDocumentos($objProcesso, $dblIdProcedimento, $parObjMetadadosTramiteAnterior) + private function atribuirDocumentosREST($objProcesso, $dblIdProcedimento, $parObjMetadadosTramiteAnterior) { + + if(!isset($objProcesso)) { throw new InfraException('Parâmetro $objProcesso não informado.'); } @@ -848,112 +882,124 @@ private function atribuirDocumentos($objProcesso, $dblIdProcedimento, $parObjMet $arrObjCompIndexadoPorIdDocumentoDTO = InfraArray::indexarArrInfraDTO($arrObjComponentesDigitaisDTO, 'IdDocumento'); } } - - $objProcesso->documento = array(); + + $objProcesso['documentos'] = array(); foreach ($arrDocumentosRelacionados as $ordem => $objDocumentosRelacionados) { $documentoDTO = $objDocumentosRelacionados["Documento"]; $staAssociacao = $objDocumentosRelacionados["StaAssociacao"]; - $documento = new stdClass(); $objPenRelHipoteseLegalRN = new PenRelHipoteseLegalEnvioRN(); //Considera o número/nome do documento externo para descrição do documento $boolDocumentoRecebidoComNumero = $documentoDTO->getStrStaProtocoloProtocolo() == ProtocoloRN::$TP_DOCUMENTO_RECEBIDO && $documentoDTO->getStrNumero() != null; $strDescricaoDocumento = ($boolDocumentoRecebidoComNumero) ? $documentoDTO->getStrNumero() : "***"; - $documento->ordem = $ordem + 1; - $documento->descricao = mb_convert_encoding($this->objProcessoEletronicoRN->reduzirCampoTexto($strDescricaoDocumento, 100), 'UTF-8', 'ISO-8859-1'); - $documento->retirado = ($documentoDTO->getStrStaEstadoProtocolo() == ProtocoloRN::$TE_DOCUMENTO_CANCELADO) ? true : false; - $documento->nivelDeSigilo = $this->obterNivelSigiloPEN($documentoDTO->getStrStaNivelAcessoLocalProtocolo()); + $documento = []; // Inicializando $documento como um array + $documento['ordem'] = $ordem + 1; + $documento['descricao'] = mb_convert_encoding($this->objProcessoEletronicoRN->reduzirCampoTexto($strDescricaoDocumento, 100), 'UTF-8', 'ISO-8859-1'); + + + $documento['retirado'] = ($documentoDTO->getStrStaEstadoProtocolo() == ProtocoloRN::$TE_DOCUMENTO_CANCELADO) ? true : false; + $documento['nivelDeSigilo'] = $this->obterNivelSigiloPEN($documentoDTO->getStrStaNivelAcessoLocalProtocolo()); + //Verifica se o documento faz parte de outro processo devido à sua anexação ou à sua movimentação - if($staAssociacao != RelProtocoloProtocoloRN::$TA_DOCUMENTO_MOVIDO){ - if($documentoDTO->getStrProtocoloProcedimentoFormatado() != $objProcesso->protocolo){ + if($staAssociacao != RelProtocoloProtocoloRN::$TA_DOCUMENTO_MOVIDO) { + if ($documentoDTO->getStrProtocoloProcedimentoFormatado() != $objProcesso['protocolo']) { // Caso o documento não tenha sido movido, seu protocolo é diferente devido à sua anexação à outro processo - $documento->protocoloDoProcessoAnexado = $documentoDTO->getStrProtocoloProcedimentoFormatado(); - $documento->idProcedimentoAnexadoSEI = $documentoDTO->getDblIdProcedimento(); + $documento['protocoloDoProcessoAnexado'] = $documentoDTO->getStrProtocoloProcedimentoFormatado(); + $documento['idProcedimentoAnexadoSEI'] = $documentoDTO->getDblIdProcedimento(); + } } else { // Em caso de documento movido, ele será tratado como cancelado para trâmites externos - $documento->retirado = true; + $documento['retirado'] = true; } - if($documentoDTO->getStrStaNivelAcessoLocalProtocolo() == ProtocoloRN::$NA_RESTRITO){ - $documento->hipoteseLegal = new stdClass(); - $documento->hipoteseLegal->identificacao = $objPenRelHipoteseLegalRN->getIdHipoteseLegalPEN($documentoDTO->getNumIdHipoteseLegalProtocolo()); + $documento['hipoteseLegal'] = array(); // Inicializando a chave 'hipoteseLegal' como um array + $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(); + $documento['dataHoraDeProducao'] = $this->objProcessoEletronicoRN->converterDataWebService($documentoDTO->getDtaGeracaoProtocolo()); + $documento['dataHoraDeRegistro'] = $this->objProcessoEletronicoRN->converterDataWebService($documentoDTO->getDtaGeracaoProtocolo()); + $documento['produtor'] = array(); // Inicializando a chave 'produtor' como um array $usuarioDTO = $this->consultarUsuario($documentoDTO->getNumIdUsuarioGeradorProtocolo()); if(isset($usuarioDTO)) { - $documento->produtor->nome = mb_convert_encoding($this->objProcessoEletronicoRN->reduzirCampoTexto($usuarioDTO->getStrNome(), 150), 'UTF-8', 'ISO-8859-1'); - $documento->produtor->numeroDeIdentificacao = $usuarioDTO->getDblCpfContato(); - //TODO: Obter tipo de pessoa fsica dos contextos/contatos do SEI - $documento->produtor->tipo = self::STA_TIPO_PESSOA_FISICA; - ; + $documento['produtor']['nome'] = mb_convert_encoding($this->objProcessoEletronicoRN->reduzirCampoTexto($usuarioDTO->getStrNome(), 150), 'UTF-8', 'ISO-8859-1'); + $documento['produtor']['numeroDeIdentificacao'] = $usuarioDTO->getDblCpfContato(); + // TODO: Obter tipo de pessoa física 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 = mb_convert_encoding($this->objProcessoEletronicoRN->reduzirCampoTexto($unidadeDTO->getStrDescricao(), 150), 'UTF-8', 'ISO-8859-1'); - $documento->produtor->unidade->tipo = self::STA_TIPO_PESSOA_ORGAOPUBLICO; + $documento['produtor']['unidade'] = []; // Inicializando a chave 'unidade' como um array + $documento['produtor']['unidade']['nome'] = mb_convert_encoding($this->objProcessoEletronicoRN->reduzirCampoTexto($unidadeDTO->getStrDescricao(), 150), 'UTF-8', 'ISO-8859-1'); + $documento['produtor']['unidade']['tipo'] = self::STA_TIPO_PESSOA_ORGAOPUBLICO; + //TODO: Informar dados da estrutura organizacional (estruturaOrganizacional) } - if(array_key_exists($documentoDTO->getDblIdDocumento(), $arrObjCompIndexadoPorIdDocumentoDTO)){ $objComponenteDigitalDTO = $arrObjCompIndexadoPorIdDocumentoDTO[$documentoDTO->getDblIdDocumento()]; if(!empty($objComponenteDigitalDTO->getNumOrdemDocumentoReferenciado())){ - $documento->ordemDoDocumentoReferenciado = $objComponenteDigitalDTO->getNumOrdemDocumentoReferenciado(); + $documento['ordemDoDocumentoReferenciado'] = $objComponenteDigitalDTO->getNumOrdemDocumentoReferenciado(); } } - - $documento->produtor->numeroDeIdentificacao = $documentoDTO->getStrProtocoloDocumentoFormatado(); - $this->atribuirDataHoraDeRegistro($documento, $documentoDTO->getDblIdProcedimento(), $documentoDTO->getDblIdDocumento()); - $this->atribuirEspecieDocumental($documento, $documentoDTO, $parObjMetadadosTramiteAnterior); - - $this->atribuirNumeracaoDocumento($documento, $documentoDTO); - if($documento->retirado === true){ + $documento['produtor']['numeroDeIdentificacao'] = $documentoDTO->getStrProtocoloDocumentoFormatado(); + $this->atribuirDataHoraDeRegistroREST($documento, $documentoDTO->getDblIdProcedimento(), $documentoDTO->getDblIdDocumento()); + $documento = $this->atribuirEspecieDocumentalREST($documento, $documentoDTO, $parObjMetadadosTramiteAnterior); + $documento = $this->atribuirNumeracaoDocumentoREST($documento, $documentoDTO); + + if($documento['retirado'] === true) { $objComponenteDigitalDTO = new ComponenteDigitalDTO(); $objComponenteDigitalDTO->retTodos(); $objComponenteDigitalDTO->setDblIdDocumento($documentoDTO->getDblIdDocumento()); $objComponenteDigitalBD = new ComponenteDigitalBD($this->getObjInfraIBanco()); - + if($objComponenteDigitalBD->contar($objComponenteDigitalDTO) > 0){ $arrobjComponenteDigitalDTO = $objComponenteDigitalBD->listar($objComponenteDigitalDTO); $componenteDigital = $arrobjComponenteDigitalDTO[0]; - $documento->componenteDigital = new stdClass(); - $documento->componenteDigital->ordem = 1; - $documento->componenteDigital->nome = mb_convert_encoding($componenteDigital->getStrNome(), 'UTF-8', 'ISO-8859-1'); - $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(); - $documento->componenteDigital = $this->atribuirDadosAssinaturaDigital($documentoDTO, $documento->componenteDigital, $componenteDigital->getStrHashConteudo()); + $arrComponentesDigitais = []; + + $documento['componentesDigitais'] = []; // Inicializando 'componentesDigitais' como um array + $arrComponentesDigitais['ordem'] = 1; + $arrComponentesDigitais['nome'] = mb_convert_encoding($componenteDigital->getStrNome(), 'UTF-8', 'ISO-8859-1'); + $arrComponentesDigitais['hash'] = [ + 'algoritmo' => $componenteDigital->getStrAlgoritmoHash(), + 'conteudo' => $componenteDigital->getStrHashConteudo() + ]; + + $arrComponentesDigitais['tamanhoEmBytes'] = $componenteDigital->getNumTamanho(); + $arrComponentesDigitais['mimeType'] = $componenteDigital->getStrMimeType(); + $arrComponentesDigitais['tipoDeConteudo'] = $componenteDigital->getStrTipoConteudo(); + $arrComponentesDigitais['idAnexo'] = $componenteDigital->getNumIdAnexo(); if($componenteDigital->getStrMimeType() == 'outro'){ - $documento->componenteDigital->dadosComplementaresDoTipoDeArquivo = 'outro'; + $arrComponentesDigitais['dadosComplementaresDoTipoDeArquivo'] = 'outro'; } + + $documento['componentesDigitais'][] = $arrComponentesDigitais; + $arrComponentesDigitais = $this->atribuirDadosAssinaturaDigitalREST($documentoDTO, $documento['componentesDigitais'], $componenteDigital->getStrHashConteudo()); + }else{ - $this->atribuirComponentesDigitais($documento, $documentoDTO, $dblIdProcedimento); + $documento = $this->atribuirComponentesDigitaisREST($documento, $documentoDTO, $dblIdProcedimento); } }else{ - $this->atribuirComponentesDigitais($documento, $documentoDTO, $dblIdProcedimento); + $documento = $this->atribuirComponentesDigitaisREST($documento, $documentoDTO, $dblIdProcedimento); } - // TODO: Necessário tratar informações abaixo //- protocoloDoDocumentoAnexado //- protocoloDoProcessoAnexado //- protocoloAnterior //- historico - $documento->idDocumentoSEI = $documentoDTO->getDblIdDocumento(); - $objProcesso->documento[] = $documento; + $documento['idDocumentoSEI'] = $documentoDTO->getDblIdDocumento(); + $objProcesso['documentos'][] = $documento; } + return $objProcesso; } + public function atribuirComponentesDigitaisRetirados($documentoDTO){ } @@ -970,9 +1016,9 @@ public function atribuirComponentesDigitaisRetirados($documentoDTO){ * @return int Código da espécie documental * */ - private function atribuirEspecieDocumental($parMetaDocumento, $parDocumentoDTO, $parObjMetadadosTramiteAnterior) - { - //Validação dos parâmetros da função + private function atribuirEspecieDocumentalREST($parMetaDocumento, $parDocumentoDTO, $parObjMetadadosTramiteAnterior) + { + //Validação dos parâmetros da função if(!isset($parDocumentoDTO)){ throw new InfraException('Parâmetro $parDocumentoDTO não informado.'); } @@ -980,41 +1026,38 @@ private function atribuirEspecieDocumental($parMetaDocumento, $parDocumentoDTO, if(!isset($parMetaDocumento)){ throw new InfraException('Parâmetro $parMetaDocumento não informado.'); } - $numCodigoEspecie = null; $strNomeEspecieProdutor = null; $dblIdProcedimento = $parDocumentoDTO->getDblIdProcedimento(); $dblIdDocumento = $parDocumentoDTO->getDblIdDocumento(); - //Inicialmente, busca espécie documental atribuida pelo produtor em trâmite realizado anteriormente + //Inicialmente, busca espécie documental atribuida pelo produtor em trâmite realizado anteriormente $objComponenteDigitalDTO = new ComponenteDigitalDTO(); $objComponenteDigitalDTO->retNumCodigoEspecie(); $objComponenteDigitalDTO->retStrNomeEspecieProdutor(); - // Verifica se o documento é de um processo anexado ou não e busca no - // campo correto - if(isset($parMetaDocumento->idProcedimentoAnexadoSEI)){ + // Verifica se o documento é de um processo anexado ou não e busca no + // campo correto + if(isset($parMetaDocumento['idProcedimentoAnexadoSEI'])){ $objComponenteDigitalDTO->setDblIdProcedimentoAnexado($dblIdProcedimento); } else{ $objComponenteDigitalDTO->setDblIdProcedimento($dblIdProcedimento); } - $objComponenteDigitalDTO->setDblIdDocumento($dblIdDocumento); $objComponenteDigitalDTO->setNumMaxRegistrosRetorno(1); $objComponenteDigitalDTO->setOrd('IdTramite', InfraDTO::$TIPO_ORDENACAO_DESC); - $objComponenteDigitalBD = new ComponenteDigitalBD($this->inicializarObjInfraIBanco()); + $objComponenteDigitalBD = new ComponenteDigitalBD(BancoSEI::getInstance()); $objComponenteDigitalDTO = $objComponenteDigitalBD->consultar($objComponenteDigitalDTO); if($objComponenteDigitalDTO != null){ $numCodigoEspecie = $objComponenteDigitalDTO->getNumCodigoEspecie(); $strNomeEspecieProdutor = mb_convert_encoding($objComponenteDigitalDTO->getStrNomeEspecieProdutor(), 'UTF-8', 'ISO-8859-1'); } - - //Caso a informação sobre mapeamento esteja nulo, necessário buscar tal informação no Barramento - //A lista de documentos recuperada do trâmite anterior será indexada pela sua ordem no protocolo e - //a espécie documental e o nome do produtor serão obtidos para atribuição ao documento + //Caso a informação sobre mapeamento esteja nulo, necessário buscar tal informação no Barramento + //A lista de documentos recuperada do trâmite anterior será indexada pela sua ordem no protocolo e + //a espécie documental e o nome do produtor serão obtidos para atribuição ao documento if($objComponenteDigitalDTO != null && $numCodigoEspecie == null) { if(isset($parObjMetadadosTramiteAnterior)){ $arrObjMetaDocumentosTramiteAnterior = array(); @@ -1036,22 +1079,23 @@ private function atribuirEspecieDocumental($parMetaDocumento, $parDocumentoDTO, } //Atribui espécie documental definida pelo produtor do documento e registrado no PEN, caso exista - if(count($arrMetaDocumentosAnteriorIndexado) > 0 && array_key_exists($parMetaDocumento->ordem, $arrMetaDocumentosAnteriorIndexado)){ - $numCodigoEspecie = $arrMetaDocumentosAnteriorIndexado[$parMetaDocumento->ordem]->especie->codigo; - $strNomeEspecieProdutor = mb_convert_encoding($arrMetaDocumentosAnteriorIndexado[$parMetaDocumento->ordem]->especie->nomeNoProdutor, 'UTF-8', 'ISO-8859-1'); + if(count($arrMetaDocumentosAnteriorIndexado) > 0 && array_key_exists($parMetaDocumento['ordem'], $arrMetaDocumentosAnteriorIndexado)){ + $numCodigoEspecie = $arrMetaDocumentosAnteriorIndexado[$parMetaDocumento['ordem']]->especie->codigo; + $strNomeEspecieProdutor = mb_convert_encoding($arrMetaDocumentosAnteriorIndexado[$parMetaDocumento['ordem']]->especie->nomeNoProdutor, 'UTF-8', 'ISO-8859-1'); } } } - - //Aplica o mapeamento de espécies definida pelo administrador para os novos documentos + //Aplica o mapeamento de espécies definida pelo administrador para os novos documentos if($numCodigoEspecie == null) { $numCodigoEspecie = $this->obterEspecieMapeada($parDocumentoDTO->getNumIdSerie()); $strNomeEspecieProdutor = mb_convert_encoding($parDocumentoDTO->getStrNomeSerie(), 'UTF-8', 'ISO-8859-1'); } - $parMetaDocumento->especie = new stdClass(); - $parMetaDocumento->especie->codigo = $numCodigoEspecie; - $parMetaDocumento->especie->nomeNoProdutor = $strNomeEspecieProdutor; + $parMetaDocumento['especie'] = array( + 'codigo' => $numCodigoEspecie, + 'nomeNoProdutor' => $strNomeEspecieProdutor + ); + return $parMetaDocumento; } @@ -1104,8 +1148,8 @@ private function atribuirAssinaturaEletronica($objComponenteDigital, AssinaturaD } } - private function atribuirComponentesDigitais($objDocumento, DocumentoDTO $objDocumentoDTO, $dblIdProcedimento = null) - { + private function atribuirComponentesDigitaisREST($objDocumento, DocumentoDTO $objDocumentoDTO, $dblIdProcedimento = null) + { if(!isset($objDocumento)){ throw new InfraException('Parâmetro $objDocumento não informado.'); } @@ -1113,12 +1157,10 @@ private function atribuirComponentesDigitais($objDocumento, DocumentoDTO $objDoc if(!isset($objDocumentoDTO)){ throw new InfraException('Parâmetro $objDocumentoDTO não informado.'); } - $arrObjDocumentoDTOAssociacao = $this->listarDocumentosRelacionados($dblIdProcedimento, $objDocumentoDTO->getDblIdDocumento()); $strStaAssociacao = count($arrObjDocumentoDTOAssociacao) == 1 ? $arrObjDocumentoDTOAssociacao[0]['StaAssociacao'] : null; $arrObjDadosArquivos = $this->listarDadosArquivos($objDocumentoDTO, $strStaAssociacao); - - $objDocumento->componenteDigital = array(); + $objDocumento['componentesDigitais'] = array(); foreach ($arrObjDadosArquivos as $numOrdemComponente => $objDadosArquivos) { if(!isset($objDadosArquivos) || count($objDadosArquivos) == 0){ @@ -1130,20 +1172,21 @@ private function atribuirComponentesDigitais($objDocumento, DocumentoDTO $objDoc $strAlgoritmoHash = $objDadosArquivos['ALGORITMO_HASH_CONTEUDO']; //TODO: Revisar tal implementação para atender a gerao de hash de arquivos grandes - $objComponenteDigital = new stdClass(); - $objComponenteDigital->ordem = $numOrdemComponente; - $objComponenteDigital->nome = mb_convert_encoding($objDadosArquivos["NOME"], 'UTF-8', 'ISO-8859-1'); - $objComponenteDigital->hash = new SoapVar("{$hashDoComponenteDigital}", XSD_ANYXML); - $objComponenteDigital->tamanhoEmBytes = $objDadosArquivos['TAMANHO']; - + $objComponenteDigital = array(); + $objComponenteDigital['ordem'] = $numOrdemComponente; + $objComponenteDigital['nome'] = mb_convert_encoding($objDadosArquivos["NOME"], 'UTF-8', 'ISO-8859-1'); + $objComponenteDigital['hash'] = [ + 'algoritmo' => $strAlgoritmoHash, + 'conteudo' => $hashDoComponenteDigital + ]; + $objComponenteDigital['tamanhoEmBytes'] = $objDadosArquivos['TAMANHO']; //TODO: Validar os tipos de mimetype de acordo com o WSDL do SEI //Caso no identifique o tipo correto, informar o valor [outro] - $objComponenteDigital->mimeType = $objDadosArquivos['MIME_TYPE']; - $objComponenteDigital->tipoDeConteudo = $this->obterTipoDeConteudo($objDadosArquivos['MIME_TYPE']); - $objComponenteDigital = $this->atribuirDadosAssinaturaDigital($objDocumentoDTO, $objComponenteDigital, $hashDoComponenteDigital); - + $objComponenteDigital['mimeType'] = $objDadosArquivos['MIME_TYPE']; + $objComponenteDigital['tipoDeConteudo'] = $this->obterTipoDeConteudo($objDadosArquivos['MIME_TYPE']); + $objComponenteDigital = $this->atribuirDadosAssinaturaDigitalREST($objDocumentoDTO, $objComponenteDigital, $hashDoComponenteDigital); if($objDadosArquivos['MIME_TYPE'] == 'outro'){ - $objComponenteDigital->dadosComplementaresDoTipoDeArquivo = $objDadosArquivos['dadosComplementaresDoTipoDeArquivo']; + $objComponenteDigital['dadosComplementaresDoTipoDeArquivo'] = $objDadosArquivos['dadosComplementaresDoTipoDeArquivo']; } //TODO: Preencher dados complementares do tipo de arquivo @@ -1152,11 +1195,12 @@ private function atribuirComponentesDigitais($objDocumento, DocumentoDTO $objDoc //TODO: Carregar informações da assinatura digital //$this->atribuirAssinaturaEletronica($objComponenteDigital, $objDocumentoDTO); - $objComponenteDigital->idAnexo = $objDadosArquivos['ID_ANEXO']; + if (isset($objDadosArquivos['ID_ANEXO']) && !empty($objDadosArquivos['ID_ANEXO'])) { + $objComponenteDigital['idAnexo'] = $objDadosArquivos['ID_ANEXO']; + } - $objDocumento->componenteDigital[] = $objComponenteDigital; + $objDocumento['componentesDigitais'][] = $objComponenteDigital; } - return $objDocumento; } @@ -1169,8 +1213,9 @@ private function atribuirComponentesDigitais($objDocumento, DocumentoDTO $objDoc * @param string $strHashDocumento * @return void */ - public function atribuirDadosAssinaturaDigital($objDocumentoDTO, $objComponenteDigital, $strHashDocumento) - { + + public function atribuirDadosAssinaturaDigitalREST($objDocumentoDTO, $objComponenteDigital, $strHashDocumento) + { $objDocumentoDTOTarjas = new DocumentoDTO(); $objDocumentoDTOTarjas->retDblIdDocumento(); $objDocumentoDTOTarjas->retStrNomeSerie(); @@ -1206,7 +1251,6 @@ public function atribuirDadosAssinaturaDigital($objDocumentoDTO, $objComponenteD $objAssinaturaDTO->retStrP7sBase64(); $resAssinatura = $this->objAssinaturaRN->listarRN1323($objAssinaturaDTO); - $objComponenteDigital->assinaturaDigital = array(); foreach ($resAssinatura as $keyOrder => $assinatura) { $objAtividadeDTO = new AtividadeDTO(); $objAtividadeDTO->setNumIdAtividade($assinatura->getNumIdAtividade()); //7 @@ -1216,20 +1260,36 @@ public function atribuirDadosAssinaturaDigital($objDocumentoDTO, $objComponenteD $objAtividadeRN = new AtividadeRN(); $objAtividade = $objAtividadeRN->consultarRN0033($objAtividadeDTO); - $objAssinaturaDigital = new stdClass(); - $objAssinaturaDigital->razao = mb_convert_encoding($dataTarjas[$keyOrder], 'UTF-8', 'ISO-8859-1'); - $objAssinaturaDigital->observacao = mb_convert_encoding($dataTarjas[count($dataTarjas) - 1], 'UTF-8', 'ISO-8859-1'); - $objAssinaturaDigital->dataHora = $this->objProcessoEletronicoRN->converterDataWebService($objAtividade->getDthAbertura()); + $objAssinaturaDigital = array(); + $objAssinaturaDigital['razao'] = mb_convert_encoding($dataTarjas[$keyOrder], 'UTF-8', 'ISO-8859-1'); + $objAssinaturaDigital['observacao'] = mb_convert_encoding($dataTarjas[count($dataTarjas) - 1], 'UTF-8', 'ISO-8859-1'); + $objAssinaturaDigital['dataHora'] = $this->objProcessoEletronicoRN->converterDataWebService($objAtividade->getDthAbertura()); if($assinatura->getStrStaFormaAutenticacao() == AssinaturaRN::$TA_CERTIFICADO_DIGITAL){ - $objAssinaturaDigital->hash = new SoapVar("{$strHashDocumento}", XSD_ANYXML); - $objAssinaturaDigital->cadeiaDoCertificado = new SoapVar(''.($assinatura->getStrP7sBase64() ? $assinatura->getStrP7sBase64() : 'null').'', XSD_ANYXML); + $objAssinaturaDigital['hash'] = [ + 'algoritmo' => self::ALGORITMO_HASH_ASSINATURA, + 'conteudo' => $strHashDocumento + ]; + $objAssinaturaDigital['cadeiaDoCertificado'] = [ + 'formato' => 'PKCS7', + 'conteudo' => $assinatura->getStrP7sBase64() ? $assinatura->getStrP7sBase64() : 'vazio' + ]; } else { - $objAssinaturaDigital->hash = new SoapVar("null", XSD_ANYXML); - $objAssinaturaDigital->cadeiaDoCertificado = new SoapVar('null', XSD_ANYXML); - } + $objAssinaturaDigital['hash'] = [ + 'algoritmo' => self::ALGORITMO_HASH_ASSINATURA, + 'conteudo' => 'vazio' + ]; + + $objAssinaturaDigital['cadeiaDoCertificado'] = [ + 'formato' => 'PKCS7', + 'conteudo' => 'vazio' + ]; + } + } - $objComponenteDigital->assinaturaDigital[] = $objAssinaturaDigital; + + if ($objAssinaturaDigital != null) { + $objComponenteDigital['assinaturasDigitais'][] = $objAssinaturaDigital; } return $objComponenteDigital; @@ -1716,14 +1776,52 @@ private function atribuirNumeracaoDocumento($objDocumento, DocumentoDTO $parObjD } } - private function adicionarProcessosApensados($objProcesso, $arrIdProcessoApensado) + private function atribuirNumeracaoDocumentoREST($objDocumento, DocumentoDTO $parObjDocumentoDTO) + { + $objSerieDTO = $this->consultarSerie($parObjDocumentoDTO->getNumIdSerie()); + + if(!isset($objSerieDTO)){ + throw new InfraException("Tipo de Documento não pode ser localizado. (Código: ".$parObjDocumentoDTO->getNumIdSerie().")"); + } + + $strStaNumeracao = $objSerieDTO->getStrStaNumeracao(); + + if ($strStaNumeracao == SerieRN::$TN_SEQUENCIAL_UNIDADE) { + $objDocumento['identificacao']['numero'] = utf8_encode($parObjDocumentoDTO->getStrNumero()); + $objDocumento['identificacao']['siglaDaUnidadeProdutora'] = utf8_encode($parObjDocumentoDTO->getStrSiglaUnidadeGeradoraProtocolo()); + $objDocumento['identificacao']['complemento'] = utf8_encode($this->objProcessoEletronicoRN->reduzirCampoTexto($parObjDocumentoDTO->getStrDescricaoUnidadeGeradoraProtocolo(), 100)); + } elseif ($strStaNumeracao == SerieRN::$TN_SEQUENCIAL_ORGAO) { + $objOrgaoDTO = $this->consultarOrgao($parObjDocumentoDTO->getNumIdOrgaoUnidadeGeradoraProtocolo()); + $objDocumento['identificacao']['numero'] = utf8_encode($parObjDocumentoDTO->getStrNumero()); + $objDocumento['identificacao']['siglaDaUnidadeProdutora'] = utf8_encode($objOrgaoDTO->getStrSigla()); + $objDocumento['identificacao']['complemento'] = utf8_encode($this->objProcessoEletronicoRN->reduzirCampoTexto($objOrgaoDTO->getStrDescricao(), 100)); + } elseif ($strStaNumeracao == SerieRN::$TN_SEQUENCIAL_ANUAL_UNIDADE) { + $objDocumento['identificacao']['siglaDaUnidadeProdutora'] = utf8_encode($parObjDocumentoDTO->getStrSiglaUnidadeGeradoraProtocolo()); + $objDocumento['identificacao']['complemento'] = utf8_encode($this->objProcessoEletronicoRN->reduzirCampoTexto($parObjDocumentoDTO->getStrDescricaoUnidadeGeradoraProtocolo(), 100)); + $objDocumento['identificacao']['numero'] = utf8_encode($parObjDocumentoDTO->getStrNumero()); + $objDocumento['identificacao']['ano'] = substr($parObjDocumentoDTO->getDtaGeracaoProtocolo(), 6, 4); + } elseif ($strStaNumeracao == SerieRN::$TN_SEQUENCIAL_ANUAL_ORGAO) { + $objOrgaoDTO = $this->consultarOrgao($parObjDocumentoDTO->getNumIdOrgaoUnidadeGeradoraProtocolo()); + $objDocumento['identificacao']['numero'] = utf8_encode($parObjDocumentoDTO->getStrNumero()); + $objDocumento['identificacao']['siglaDaUnidadeProdutora'] = utf8_encode($objOrgaoDTO->getStrSigla()); + $objDocumento['identificacao']['complemento'] = utf8_encode($this->objProcessoEletronicoRN->reduzirCampoTexto($objOrgaoDTO->getStrDescricao(), 100)); + $objDocumento['identificacao']['ano'] = substr($parObjDocumentoDTO->getDtaGeracaoProtocolo(), 6, 4); + } + + return $objDocumento; + } + + private function adicionarProcessosApensadosREST($objProcesso, $arrIdProcessoApensado) { - if(isset($arrIdProcessoApensado) && is_array($arrIdProcessoApensado) && count($arrIdProcessoApensado) > 0) { - $objProcesso->processoApensado = array(); - foreach($arrIdProcessoApensado as $idProcedimentoApensado) { - $objProcesso->processoApensado[] = $this->construirProcesso($idProcedimentoApensado); + if (isset($arrIdProcessoApensado) && is_array($arrIdProcessoApensado) && count($arrIdProcessoApensado) > 0) { + $objProcesso['processoApensado'] = array(); + + foreach ($arrIdProcessoApensado as $idProcedimentoApensado) { + $objProcesso['processoApensado'][] = $this->construirProcessoREST($idProcedimentoApensado); } } + + return $objProcesso; } private function consultarUnidade($numIdUnidade) @@ -2104,7 +2202,7 @@ private function enviarComponentesDigitais($strNumeroRegistro, $numIdTramite, $s ]; $this->salvarAnexoImutavel($dados); - $dadosDoComponenteDigital->conteudoDoComponenteDigital = new SoapVar($objDadosArquivo['CONTEUDO'], XSD_BASE64BINARY); + $dadosDoComponenteDigital->conteudoDoComponenteDigital = $objDadosArquivo['CONTEUDO']; $parametros = new stdClass(); $parametros->dadosDoComponenteDigital = $dadosDoComponenteDigital; @@ -2262,7 +2360,7 @@ private function enviarComponenteDigitalParticionado($strCaminhoAnexo, $dadosDoC $identificacaoDaParte->fim = ($inicio + $tamanhoParteArquivo); $dadosDoComponenteDigital->identificacaoDaParte = $identificacaoDaParte; - $dadosDoComponenteDigital->conteudoDaParteDeComponenteDigital = new SoapVar($parteDoArquivo, XSD_BASE64BINARY); + $dadosDoComponenteDigital->conteudoDaParteDeComponenteDigital = $parteDoArquivo; $parametros = new stdClass(); $parametros->dadosDaParteDeComponenteDigital = $dadosDoComponenteDigital; @@ -2882,7 +2980,7 @@ private function enviarParteDoComponenteDigital($parInicio, $parFim, $parParteDo $identificacaoDaParte->inicio = $parInicio; $identificacaoDaParte->fim = $parFim; $parDadosDoComponenteDigital->identificacaoDaParte = $identificacaoDaParte; - $parDadosDoComponenteDigital->conteudoDaParteDeComponenteDigital = new SoapVar($parParteDoArquivo, XSD_BASE64BINARY); + $parDadosDoComponenteDigital->conteudoDaParteDeComponenteDigital = $parParteDoArquivo; $parametros = new stdClass(); $parametros->dadosDaParteDeComponenteDigital = $parDadosDoComponenteDigital; @@ -3066,18 +3164,28 @@ protected function cancelarTramiteInternoControlado(ProtocoloDTO $objDtoProtocol $objPenBlocoProcessoRN = new PenBlocoProcessoRN(); $objPenBlocoProcessoDTO = $objPenBlocoProcessoRN->consultar($objPenBlocoProcessoDTO); + $cancelarLote=false; + + if(!is_null($objPenBlocoProcessoDTO)){ + $cancelarLote=true; + } + + if(!$cancelarLote){ - $objTramiteDTO = new TramiteDTO(); - $objTramiteDTO->setNumIdProcedimento($objDtoProtocolo->getDblIdProtocolo()); - $objTramiteDTO->setStrStaTipoTramite(ProcessoEletronicoRN::$STA_TIPO_TRAMITE_ENVIO); - $objTramiteDTO->setOrd('Registro', InfraDTO::$TIPO_ORDENACAO_DESC); - $objTramiteDTO->setNumMaxRegistrosRetorno(1); - $objTramiteDTO->retNumIdTramite(); + $objTramiteDTO = new TramiteDTO(); + $objTramiteDTO->setNumIdProcedimento($objDtoProtocolo->getDblIdProtocolo()); + $objTramiteDTO->setStrStaTipoTramite(ProcessoEletronicoRN::$STA_TIPO_TRAMITE_ENVIO); + $objTramiteDTO->setOrd('Registro', InfraDTO::$TIPO_ORDENACAO_DESC); + $objTramiteDTO->setNumMaxRegistrosRetorno(1); + $objTramiteDTO->retNumIdTramite(); - $objTramiteBD = new TramiteBD($this->getObjInfraIBanco()); - $objTramiteDTO = $objTramiteBD->consultar($objTramiteDTO); + $objTramiteBD = new TramiteBD($this->getObjInfraIBanco()); + $objTramiteDTO = $objTramiteBD->consultar($objTramiteDTO); + + if(!isset($objTramiteDTO)){ + throw new InfraException("Trâmite não encontrado para o processo {$objDtoProtocolo->getDblIdProtocolo()}."); + } - if(isset($objTramiteDTO)) { $tramites = $this->objProcessoEletronicoRN->consultarTramites($objTramiteDTO->getNumIdTramite(), null, $objPenUnidadeDTO->getNumIdUnidadeRH(), null, null, $numIdRespositorio); $tramite = $tramites ? $tramites[0] : null; @@ -3122,7 +3230,7 @@ protected function cancelarTramiteInternoControlado(ProtocoloDTO $objDtoProtocol break; } - // Solicitação de cancelamento de tramite de processo ao TramitaGOV.br +// Solicitação de cancelamento de tramite de processo ao TramitaGOV.br // Somente solicita cancelamento ao PEN se processo ainda não estiver cancelado if(!in_array($numSituacaoAtual, array(ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_CANCELADO_AUTOMATICAMENTE, ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_CANCELADO))) { $this->objProcessoEletronicoRN->cancelarTramite($tramite->IDT); @@ -3398,4 +3506,4 @@ private function lancarEventoEnvioMetadados($parNumIdTramite) } } -} +} \ No newline at end of file diff --git a/src/rn/PENAgendamentoRN.php b/src/rn/PENAgendamentoRN.php index 634c16473..7cd742fe8 100755 --- a/src/rn/PENAgendamentoRN.php +++ b/src/rn/PENAgendamentoRN.php @@ -22,12 +22,12 @@ protected function atualizarHipotesesLegaisControlado() $hipotesesPenDesativadas = $processoEletronicoRN->consultarHipotesesLegais(false); $hipoteses = array(); - if (!empty($hipotesesPen) && !empty($hipotesesPen->hipotesesLegais) && !empty($hipotesesPen->hipotesesLegais->hipotese)) { - $hipoteses = $hipotesesPen->hipotesesLegais->hipotese; + if (!empty($hipotesesPen) && !empty($hipotesesPen['hipotesesLegais'])) { + $hipoteses = $hipotesesPen['hipotesesLegais']; } - if (!empty($hipotesesPenDesativadas) && !empty($hipotesesPenDesativadas->hipotesesLegais) && !empty($hipotesesPenDesativadas->hipotesesLegais->hipotese)) { - $hipoteses = array_merge($hipoteses, $hipotesesPenDesativadas->hipotesesLegais->hipotese); + if (!empty($hipotesesPenDesativadas) && !empty($hipotesesPenDesativadas['hipotesesLegais'])) { + $hipoteses = array_merge($hipoteses, $hipotesesPenDesativadas['hipotesesLegais']); } if(empty($hipoteses)){ @@ -38,20 +38,20 @@ protected function atualizarHipotesesLegaisControlado() foreach ($hipoteses as $hipotese) { $objDTO = new PenHipoteseLegalDTO(); - $objDTO->setNumIdentificacao($hipotese->identificacao); + $objDTO->setNumIdentificacao($hipotese['identificacao']); $objDTO->setNumMaxRegistrosRetorno(1); $objDTO->retStrNome(); $objDTO->retNumIdHipoteseLegal(); $objConsulta = $objBD->consultar($objDTO); //Caso não haja um nome para a hipótese legal, ele pula para a próxima. - if (empty($hipotese->nome)) { + if (empty($hipotese['nome'])) { continue; } - $objDTO->setStrNome(mb_convert_encoding($hipotese->nome, 'ISO-8859-1', 'UTF-8')); + $objDTO->setStrNome(mb_convert_encoding($hipotese['nome'], 'ISO-8859-1', 'UTF-8')); - if ($hipotese->status) { + if ($hipotese['status']) { $objDTO->setStrAtivo('S'); } else { $objDTO->setStrAtivo('N'); @@ -59,7 +59,6 @@ protected function atualizarHipotesesLegaisControlado() //Caso não exista a hipótese irá cadastra-la no sei. if (empty($objConsulta)) { - $objBD->cadastrar($objDTO); } else { //Caso contrário apenas irá atualizar os dados. diff --git a/src/rn/ProcessoEletronicoRN.php b/src/rn/ProcessoEletronicoRN.php index 56a38442f..b709b3397 100755 --- a/src/rn/ProcessoEletronicoRN.php +++ b/src/rn/ProcessoEletronicoRN.php @@ -1,5 +1,13 @@ "Outro" ); - private $objPenWs; private $strEnderecoWebService; - private $options; private $numTentativasErro; - private $strComumXSD; private $strLocalCert; private $strLocalCertPassword; - public function __construct() - { - $objConfiguracaoModPEN = ConfiguracaoModPEN::getInstance(); - $strEnderecoWebService = $objConfiguracaoModPEN->getValor("PEN", "WebService"); - $strLocalizacaoCertificadoDigital = $objConfiguracaoModPEN->getValor("PEN", "LocalizacaoCertificado"); - $strSenhaCertificadoDigital = $objConfiguracaoModPEN->getValor("PEN", "SenhaCertificado"); - $numTentativasErro = $objConfiguracaoModPEN->getValor("PEN", "NumeroTentativasErro", false, self::WS_TENTATIVAS_ERRO); - $numTentativasErro = (is_numeric($numTentativasErro)) ? intval($numTentativasErro) : self::WS_TENTATIVAS_ERRO; - - $this->strEnderecoWebService = $strEnderecoWebService; - $this->strComumXSD = $this->strEnderecoWebService . '?xsd=comum.xsd'; - $this->strLocalCert = $strLocalizacaoCertificadoDigital; - $this->strLocalCertPassword = $strSenhaCertificadoDigital; - $this->numTentativasErro = $numTentativasErro; - - $this->options = array( - 'soap_version' => SOAP_1_1 - , 'local_cert' => $this->strLocalCert - , 'passphrase' => $this->strLocalCertPassword - , 'resolve_wsdl_remote_includes' => true - , 'connection_timeout' => self::WS_TIMEOUT_CONEXAO - , 'compression' => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP - , 'encoding' => 'UTF-8' - , 'attachment_type' => BeSimple\SoapCommon\Helper::ATTACHMENTS_TYPE_MTOM - , 'ssl' => array( - 'allow_self_signed' => true, - ) - ); + private $strClientGuzzle; + private $strBaseUri; + private $arrheaders; + + public function __construct() + { + $objConfiguracaoModPEN = ConfiguracaoModPEN::getInstance(); + $strEnderecoWebService = $objConfiguracaoModPEN->getValor("PEN", "WebService"); + $strLocalizacaoCertificadoDigital = $objConfiguracaoModPEN->getValor("PEN", "LocalizacaoCertificado"); + $strSenhaCertificadoDigital = $objConfiguracaoModPEN->getValor("PEN", "SenhaCertificado"); + $numTentativasErro = $objConfiguracaoModPEN->getValor("PEN", "NumeroTentativasErro", false, self::WS_TENTATIVAS_ERRO); + $numTentativasErro = (is_numeric($numTentativasErro)) ? intval($numTentativasErro) : self::WS_TENTATIVAS_ERRO; + + $this->strEnderecoWebService = $strEnderecoWebService; + $this->strLocalCert = $strLocalizacaoCertificadoDigital; + $this->strLocalCertPassword = $strSenhaCertificadoDigital; + $this->numTentativasErro = $numTentativasErro; + + + // TODO: lembrar de pegar url dinamicamente quando SOAP for removido + $this->strBaseUri = $strEnderecoWebService; + $this->arrheaders = [ + 'Accept' => '*/*', + 'Content-Type' => 'application/json', + ]; + + $this->strClientGuzzle = new Client([ + 'base_uri' => $this->strBaseUri, + 'timeout' => self::WS_TIMEOUT_CONEXAO, + 'headers' => $this->arrheaders, + 'cert' => [$strLocalizacaoCertificadoDigital, $strSenhaCertificadoDigital], + ]); } - protected function inicializarObjInfraIBanco() { - return BancoSEI::getInstance(); + return BancoSEI::getInstance(); } /** - * Construtor do objeto SoapClien utilizado para comunicação Webservice SOAP + * Construtor do objeto SoapClien utilizado para comunicação Webservice * - * @return void */ private function getObjPenWs() { - if($this->objPenWs == null) { - - if (InfraString::isBolVazia($this->strEnderecoWebService)) { + if (InfraString::isBolVazia($this->strEnderecoWebService)) { throw new InfraException('Endereço do serviço de integração do Tramita GOV.BR não informado.'); - } + } - if (InfraString::isBolVazia($this->strLocalCertPassword)) { - throw new InfraException('Dados de autenticação do serviço de integração do Tramita.GOV.BR não informados.'); - } + if (InfraString::isBolVazia($this->strLocalCertPassword)) { + throw new InfraException('Dados de autenticação do serviço de integração do Tramita.GOV.BR não informados.'); + } - $this->validarDisponibilidade(); + // Validar disponibilidade do serviço + $endpoint = $this->strEnderecoWebService . 'healthcheck'; - try { - $strWSDL = $this->strEnderecoWebService . '?wsdl'; - $this->objPenWs = new BeSimple\SoapClient\SoapClient($strWSDL, $this->options); - } catch (Exception $e) { - $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); - $mensagem = "Falha de comunicação com o Tramita GOV.BR: " . $detalhes; - throw new \SoapFault("HTTP", $mensagem); + try{ + $response = $this->strClientGuzzle->request('GET', $endpoint); + + if ($response->getStatusCode() !== 200) { + throw new \RuntimeException('Falha ao conectar com o serviço REST'); } + } catch (RequestException $e) { + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + $mensagem = "Falha de comunicação com o Tramita GOV.BR: " . $detalhes; + throw new \Exception($mensagem); } - - return $this->objPenWs; } @@ -174,36 +180,28 @@ private function getObjPenWs() * Consulta a lista de repositório de estruturas disponíveis no Barramento de Serviços do PEN * * @param int $numIdentificacaoDoRepositorioDeEstruturas Código de identificação do repositório de estruturas do PEN - * @return void */ public function consultarRepositoriosDeEstruturas($numIdentificacaoDoRepositorioDeEstruturas) { $objRepositorioDTO = null; - try{ - $parametros = new stdClass(); - $parametros->filtroDeConsultaDeRepositoriosDeEstrutura = new stdClass(); - $parametros->filtroDeConsultaDeRepositoriosDeEstrutura->ativos = false; - - $result = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - return $objPenWs->consultarRepositoriosDeEstruturas($parametros); - }); - - if(isset($result->repositoriosEncontrados->repositorio)){ - - if(!is_array($result->repositoriosEncontrados->repositorio)) { - $result->repositoriosEncontrados->repositorio = array($result->repositoriosEncontrados->repositorio); - } - - foreach ($result->repositoriosEncontrados->repositorio as $repositorio) { - if($repositorio->id == $numIdentificacaoDoRepositorioDeEstruturas){ - $objRepositorioDTO = new RepositorioDTO(); - $objRepositorioDTO->setNumId($repositorio->id); - $objRepositorioDTO->setStrNome(mb_convert_encoding($repositorio->nome, 'ISO-8859-1', 'UTF-8')); - $objRepositorioDTO->setBolAtivo($repositorio->ativo); + $endpoint = 'repositorios-de-estruturas'; + try { + $parametros = [ + 'ativo' => true + ]; + $arrResultado = $this->get($endpoint, $parametros); + + if (isset($arrResultado)) { + foreach ($arrResultado as $repositorio) { + if ($repositorio['id'] == $numIdentificacaoDoRepositorioDeEstruturas) { + $objRepositorioDTO = new RepositorioDTO(); + $objRepositorioDTO->setNumId($repositorio['id']); + $objRepositorioDTO->setStrNome(mb_convert_encoding($repositorio['nome'], 'ISO-8859-1', 'UTF-8')); + $objRepositorioDTO->setBolAtivo($repositorio['ativo']); + } } } - } - } catch(Exception $e){ + } catch (Exception $e) { $mensagem = "Falha na obtenção dos Repositórios de Estruturas Organizacionais"; $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); throw new InfraException($mensagem, $e, $detalhes); @@ -217,99 +215,82 @@ public function consultarRepositoriosDeEstruturas($numIdentificacaoDoRepositorio * * @return void */ - public function listarRepositoriosDeEstruturas() + public function listarRepositoriosDeEstruturas($ativo = true) { - $arrObjRepositorioDTO = array(); - - try{ - $parametros = new stdClass(); - $parametros->filtroDeConsultaDeRepositoriosDeEstrutura = new stdClass(); - $parametros->filtroDeConsultaDeRepositoriosDeEstrutura->ativos = true; - - $result = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - return $objPenWs->consultarRepositoriosDeEstruturas($parametros); - }); - - if(isset($result->repositoriosEncontrados->repositorio)){ - if(!is_array($result->repositoriosEncontrados->repositorio)) { - $result->repositoriosEncontrados->repositorio = array($result->repositoriosEncontrados->repositorio); - } - - foreach ($result->repositoriosEncontrados->repositorio as $repositorio) { - $item = new RepositorioDTO(); - $item->setNumId($repositorio->id); - $item->setStrNome(mb_convert_encoding($repositorio->nome, 'ISO-8859-1', 'UTF-8')); - $item->setBolAtivo($repositorio->ativo); - $arrObjRepositorioDTO[] = $item; + $arrObjRepositorioDTO = []; + $endpoint = 'repositorios-de-estruturas'; + + try { + $parametros = [ + 'ativos' => $ativo + ]; + + $arrResultado = $this->get($endpoint, $parametros); + + if (isset($arrResultado)) { + foreach ($arrResultado as $repositorio) { + $objRepositorioDTO = new RepositorioDTO(); + $objRepositorioDTO->setNumId($repositorio['id']); + $objRepositorioDTO->setStrNome(mb_convert_encoding($repositorio['nome'], 'ISO-8859-1', 'UTF-8')); + $objRepositorioDTO->setBolAtivo($repositorio['ativo']); + $arrObjRepositorioDTO[] = $objRepositorioDTO; + } } - } - } catch(Exception $e){ + } catch(Exception $e) { $mensagem = "Falha na obtenção dos Repositórios de Estruturas Organizacionais"; $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); throw new InfraException($mensagem, $e, $detalhes); } - + return $arrObjRepositorioDTO; } - /** - * Método responsável por consultar as estruturas das unidades externas no barramento - * @param $idRepositorioEstrutura - * @param $numeroDeIdentificacaoDaEstrutura - * @param bool $bolRetornoRaw - * @return EstruturaDTO|mixed - * @throws InfraException - */ + * Método responsável por consultar as estruturas das unidades externas no barramento. + * + * @param int $idRepositorioEstrutura + * @param int $numeroDeIdentificacaoDaEstrutura + * @param bool $bolRetornoRaw + * @throws InfraException + * @return EstruturaDTO + */ public function consultarEstrutura($idRepositorioEstrutura, $numeroDeIdentificacaoDaEstrutura, $bolRetornoRaw = false) - { + { + $endpoint = "repositorios-de-estruturas/{$idRepositorioEstrutura}/estruturas-organizacionais/$numeroDeIdentificacaoDaEstrutura"; try { - $parametros = new stdClass(); - $parametros->filtroDeEstruturas = new stdClass(); - $parametros->filtroDeEstruturas->identificacaoDoRepositorioDeEstruturas = $idRepositorioEstrutura; - $parametros->filtroDeEstruturas->numeroDeIdentificacaoDaEstrutura = $numeroDeIdentificacaoDaEstrutura; - $parametros->filtroDeEstruturas->apenasAtivas = false; - $result = $this->tentarNovamenteSobErroHTTP(function ($objPenWs) use ($parametros) { - return $objPenWs->consultarEstruturas($parametros); - }); - - if ($result->estruturasEncontradas->totalDeRegistros == 1) { - $arrObjEstrutura = is_array($result->estruturasEncontradas->estrutura) ? $result->estruturasEncontradas->estrutura : array($result->estruturasEncontradas->estrutura); - $objEstrutura = current($arrObjEstrutura); + $parametros = []; + $arrResultado = $this->get($endpoint, $parametros); - $objEstrutura->nome = mb_convert_encoding($objEstrutura->nome, 'ISO-8859-1', 'UTF-8'); - $objEstrutura->sigla = mb_convert_encoding($objEstrutura->sigla, 'ISO-8859-1', 'UTF-8'); - - if ($bolRetornoRaw !== false) { - if (isset($objEstrutura->hierarquia) && isset($objEstrutura->hierarquia->nivel)) { - if (!is_array($objEstrutura->hierarquia->nivel)) { - $objEstrutura->hierarquia->nivel = array($objEstrutura->hierarquia->nivel); - } + if ($bolRetornoRaw !== false) { + $arrResultado['nome'] = mb_convert_encoding($arrResultado['nome'], 'ISO-8859-1', 'UTF-8'); + $arrResultado['sigla'] = mb_convert_encoding($arrResultado['sigla'], 'ISO-8859-1', 'UTF-8'); - foreach ($objEstrutura->hierarquia->nivel as &$objNivel) { - $objNivel->nome = mb_convert_encoding($objNivel->nome, 'ISO-8859-1', 'UTF-8'); - } + if (isset($arrResultado['hierarquia']) && is_array($arrResultado['hierarquia'])) { + foreach ($arrResultado['hierarquia'] as &$arrHierarquia) { + $arrHierarquia['nome'] = mb_convert_encoding($arrHierarquia['nome'], 'ISO-8859-1', 'UTF-8'); } - return $objEstrutura; - } else { - $objEstruturaDTO = new EstruturaDTO(); - $objEstruturaDTO->setNumNumeroDeIdentificacaoDaEstrutura($objEstrutura->numeroDeIdentificacaoDaEstrutura); - $objEstruturaDTO->setStrNome($objEstrutura->nome); - $objEstruturaDTO->setStrSigla($objEstrutura->sigla); - $objEstruturaDTO->setBolAtivo($objEstrutura->ativo); - $objEstruturaDTO->setBolAptoParaReceberTramites($objEstrutura->aptoParaReceberTramites); - $objEstruturaDTO->setStrCodigoNoOrgaoEntidade($objEstrutura->codigoNoOrgaoEntidade); - return $objEstruturaDTO; } + + return self::converterArrayParaObjeto($arrResultado); } + + $objEstruturaDTO = new EstruturaDTO(); + $objEstruturaDTO->setNumNumeroDeIdentificacaoDaEstrutura($arrResultado['numeroDeIdentificacaoDaEstrutura']); + $objEstruturaDTO->setStrNome(mb_convert_encoding($arrResultado['nome'], 'ISO-8859-1', 'UTF-8')); + $objEstruturaDTO->setStrSigla(mb_convert_encoding($arrResultado['sigla'], 'ISO-8859-1', 'UTF-8')); + $objEstruturaDTO->setBolAtivo($arrResultado['ativo']); + $objEstruturaDTO->setBolAptoParaReceberTramites($arrResultado['aptoParaReceberTramites']); + $objEstruturaDTO->setStrCodigoNoOrgaoEntidade($arrResultado['codigoNoOrgaoEntidade']); + + return $objEstruturaDTO; } catch (Exception $e) { - $mensagem = "Falha na obtenção de unidades externas"; - $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); - throw new InfraException($mensagem, $e, $detalhes); + $mensagem = "Falha na obtenção de unidades externas"; + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + throw new InfraException($mensagem, $e, $detalhes); } } - /** + /** * Método responsável por recuperar pela estutura pai a estrutura de filhos de uma unidade * @param $idRepositorioEstrutura * @param null $numeroDeIdentificacaoDaEstrutura @@ -347,7 +328,149 @@ public function consultarEstruturasPorEstruturaPai($idRepositorioEstrutura, $num } } - /** + /** + * Lista estruturas de um repositório de estruturas. + * + * @param int $idRepositorioEstrutura ID do repositório de estruturas. + * @param string $nome + * @param int $numeroDeIdentificacaoDaEstruturaRaizDaConsulta + * @param string $nomeUnidade + * @param string $siglaUnidade + * @param int $offset Offset + * @param int $registrosPorPagina + * @param bool $parBolPermiteRecebimento + * @param bool $parBolPermiteEnvio + * @throws InfraException + * @return EstruturaDTO + */ + public function listarEstruturas( + $idRepositorioEstrutura, + $nome = '', + $numeroDeIdentificacaoDaEstruturaRaizDaConsulta = null, + $nomeUnidade = null, + $siglaUnidade = null, + $offset = null, + $registrosPorPagina = null, + $parBolPermiteRecebimento = null, + $parBolPermiteEnvio = null + ) { + $arrObjEstruturaDTO = []; + try { + $idRepositorioEstrutura = filter_var($idRepositorioEstrutura, FILTER_SANITIZE_NUMBER_INT); + if (!$idRepositorioEstrutura) { + throw new InfraException('Repositório de Estruturas inválido'); + } + + $parametros = [ + 'apenasAtivas' => true, + 'identificacaoDoRepositorioDeEstruturas' => $idRepositorioEstrutura, + 'sigla' => $siglaUnidade, + 'nome' => $nomeUnidade, + 'permiteRecebimento' => $parBolPermiteRecebimento, + 'permiteEnvio' => $parBolPermiteEnvio, + 'numeroDeIdentificacaoDaEstruturaRaizDaConsulta' => $numeroDeIdentificacaoDaEstruturaRaizDaConsulta ?: $nome, + 'registroInicial' => $offset, + 'quantidadeDeRegistros' => $registrosPorPagina, + ]; + + $arrResultado = $this->consultarEstruturas($idRepositorioEstrutura, $parametros); + + if ($arrResultado['totalDeRegistros'] > 0) { + + foreach ($arrResultado['estruturas'] as $estrutura) { + $objEstruturaDTO = new EstruturaDTO(); + $objEstruturaDTO->setNumNumeroDeIdentificacaoDaEstrutura($estrutura['numeroDeIdentificacaoDaEstrutura']); + $objEstruturaDTO->setStrNome(mb_convert_encoding($estrutura['nome'], 'ISO-8859-1', 'UTF-8')); + $objEstruturaDTO->setStrSigla(mb_convert_encoding($estrutura['sigla'], 'ISO-8859-1', 'UTF-8')); + $objEstruturaDTO->setBolAtivo($estrutura['ativo']); + $objEstruturaDTO->setBolAptoParaReceberTramites($estrutura['aptoParaReceberTramites']); + $objEstruturaDTO->setStrCodigoNoOrgaoEntidade($estrutura['codigoNoOrgaoEntidade']); + $objEstruturaDTO->setNumTotalDeRegistros($arrResultado['totalDeRegistros']); + + $arrHerarquia = array_map(function ($nivel) { + return mb_convert_encoding($nivel['sigla'], 'ISO-8859-1', 'UTF-8'); + }, $estrutura['hierarquia'] ?: []); + + $objEstruturaDTO->setArrHierarquia($arrHerarquia); + + $arrObjEstruturaDTO[] = $objEstruturaDTO; + } + } + } catch (Exception $e) { + $mensagem = "Falha na obtenção de unidades externas"; + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + throw new InfraException($mensagem, $e, $detalhes); + } + + return $arrObjEstruturaDTO; + } + + + /** + * Lista estruturas de um repositório de estruturas. + * + * @param int $idRepositorioEstrutura ID do repositório de estruturas. + * @param string $nome + * @param int $numeroDeIdentificacaoDaEstruturaRaizDaConsulta + * @param string $nomeUnidade + * @param string $siglaUnidade + * @param int $offset Offset + * @param int $registrosPorPagina + * @param bool $parBolPermiteRecebimento + * @param bool $parBolPermiteEnvio + * @throws InfraException + * @return EstruturaDTO + */ + public function buscarEstrutura( + $idRepositorioEstrutura, + $nome = '', + $numeroDeIdentificacaoDaEstruturaRaizDaConsulta = null, + $nomeUnidade = null, + $siglaUnidade = null, + $offset = null, + $registrosPorPagina = null, + $parBolPermiteRecebimento = null, + $parBolPermiteEnvio = null + ) { + $arrObjEstruturaDTO = []; + try { + $idRepositorioEstrutura = filter_var($idRepositorioEstrutura, FILTER_SANITIZE_NUMBER_INT); + if (!$idRepositorioEstrutura) { + throw new InfraException('Repositório de Estruturas inválido'); + } + + $rh = $numeroDeIdentificacaoDaEstruturaRaizDaConsulta ?: $nome; + + $estrutura = $this->buscarEstruturaRest($idRepositorioEstrutura, $rh); + + if ($estrutura !== null) { + + $objEstruturaDTO = new EstruturaDTO(); + $objEstruturaDTO->setNumNumeroDeIdentificacaoDaEstrutura($estrutura['numeroDeIdentificacaoDaEstrutura']); + $objEstruturaDTO->setStrNome(mb_convert_encoding($estrutura['nome'], 'ISO-8859-1', 'UTF-8')); + $objEstruturaDTO->setStrSigla(mb_convert_encoding($estrutura['sigla'], 'ISO-8859-1', 'UTF-8')); + $objEstruturaDTO->setBolAtivo($estrutura['ativo']); + $objEstruturaDTO->setBolAptoParaReceberTramites($estrutura['aptoParaReceberTramites']); + $objEstruturaDTO->setStrCodigoNoOrgaoEntidade($estrutura['codigoNoOrgaoEntidade']); + + $arrHerarquia = array_map(function ($nivel) { + return mb_convert_encoding($nivel['sigla'], 'ISO-8859-1', 'UTF-8'); + }, $estrutura['hierarquia'] ?: []); + + $objEstruturaDTO->setArrHierarquia($arrHerarquia); + + return $objEstruturaDTO; + } + + return null; + } catch (Exception $e) { + throw new InfraException("Falha na obtenção de unidades externas"); + } + + return $arrObjEstruturaDTO; + } + + /** * Verifica se o repositório de estruturas possui limitação de repositórios/unidades mapeadas * * @param $idRepositorioEstrutura @@ -439,95 +562,6 @@ private function buscarEstruturasPorEstruturaPai($idRepositorioEstrutura, $numer : array($result->estruturasEncontradasNoFiltroPorEstruturaPai->estrutura); } - public function listarEstruturas($idRepositorioEstrutura, $nome = '', $numeroDeIdentificacaoDaEstruturaRaizDaConsulta = null, - $nomeUnidade = null, $siglaUnidade = null, $offset = null, $registrosPorPagina = null, $parBolPermiteRecebimento = null, $parBolPermiteEnvio = null) - { - $arrObjEstruturaDTO = array(); - - try{ - $idRepositorioEstrutura = filter_var($idRepositorioEstrutura, FILTER_SANITIZE_NUMBER_INT); - if(!$idRepositorioEstrutura) { - throw new InfraException("Repositório de Estruturas inválido"); - } - - $parametros = new stdClass(); - $parametros->filtroDeEstruturas = new stdClass(); - $parametros->filtroDeEstruturas->identificacaoDoRepositorioDeEstruturas = $idRepositorioEstrutura; - $parametros->filtroDeEstruturas->apenasAtivas = true; - - if(!is_null($numeroDeIdentificacaoDaEstruturaRaizDaConsulta)){ - $parametros->filtroDeEstruturas->numeroDeIdentificacaoDaEstruturaRaizDaConsulta = $numeroDeIdentificacaoDaEstruturaRaizDaConsulta; - }else{ - $nome = trim($nome); - if(is_numeric($nome)) { - $parametros->filtroDeEstruturas->numeroDeIdentificacaoDaEstrutura = intval($nome); - } else { - $parametros->filtroDeEstruturas->nome = mb_convert_encoding($nome, 'UTF-8', 'ISO-8859-1'); - } - } - - if(!is_null($siglaUnidade)){ - $parametros->filtroDeEstruturas->sigla = $siglaUnidade; - } - - if(!is_null($nomeUnidade)){ - $parametros->filtroDeEstruturas->nome = mb_convert_encoding($nomeUnidade, 'UTF-8', 'ISO-8859-1'); - } - - if(!is_null($registrosPorPagina) && !is_null($offset)){ - $parametros->filtroDeEstruturas->paginacao = new stdClass(); - $parametros->filtroDeEstruturas->paginacao->registroInicial = $offset; - $parametros->filtroDeEstruturas->paginacao->quantidadeDeRegistros = $registrosPorPagina; - } - - if(!is_null($parBolPermiteRecebimento) && $parBolPermiteRecebimento === true){ - $parametros->filtroDeEstruturas->permiteRecebimento = true; - } - - if(!is_null($parBolPermiteEnvio) && $parBolPermiteEnvio === true){ - $parametros->filtroDeEstruturas->permiteEnvio = true; - } - - $result = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - return $objPenWs->consultarEstruturas($parametros); - }); - - if($result->estruturasEncontradas->totalDeRegistros > 0) { - - if(!is_array($result->estruturasEncontradas->estrutura)) { - $result->estruturasEncontradas->estrutura = array($result->estruturasEncontradas->estrutura); - } - - foreach ($result->estruturasEncontradas->estrutura as $estrutura) { - $item = new EstruturaDTO(); - $item->setNumNumeroDeIdentificacaoDaEstrutura($estrutura->numeroDeIdentificacaoDaEstrutura); - $item->setStrNome(mb_convert_encoding($estrutura->nome, 'ISO-8859-1', 'UTF-8')); - $item->setStrSigla(mb_convert_encoding($estrutura->sigla, 'ISO-8859-1', 'UTF-8')); - $item->setBolAtivo($estrutura->ativo); - $item->setBolAptoParaReceberTramites($estrutura->aptoParaReceberTramites); - $item->setStrCodigoNoOrgaoEntidade($estrutura->codigoNoOrgaoEntidade); - $item->setNumTotalDeRegistros($result->estruturasEncontradas->totalDeRegistros); - - if(!empty($estrutura->hierarquia->nivel)) { - $array = array(); - foreach($estrutura->hierarquia->nivel as $nivel) { - $array[] = mb_convert_encoding($nivel->sigla, 'ISO-8859-1', 'UTF-8'); - } - $item->setArrHierarquia($array); - } - - $arrObjEstruturaDTO[] = $item; - } - } - - } catch (Exception $e) { - $mensagem = "Falha na obtenção de unidades externas"; - $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); - throw new InfraException($mensagem, $e, $detalhes); - } - - return $arrObjEstruturaDTO; - } public function listarEstruturasBuscaTextual( $idRepositorioEstrutura, @@ -543,71 +577,55 @@ public function listarEstruturasBuscaTextual( $arrObjEstruturaDTO = array(); try { - $idRepositorioEstrutura = filter_var($idRepositorioEstrutura, FILTER_SANITIZE_NUMBER_INT); + $idRepositorioEstrutura = filter_var($idRepositorioEstrutura, FILTER_SANITIZE_NUMBER_INT); if (!$idRepositorioEstrutura) { - throw new InfraException("Repositório de Estruturas inválido"); - } - - $totalDeRegistros = 0; - $estruturasUnidades = null; - if (is_null($numeroDeIdentificacaoDaEstruturaRaizDaConsulta) || empty($numeroDeIdentificacaoDaEstruturaRaizDaConsulta)) { - $estruturasUnidades = $this->validarRestricaoUnidadesCadastradas($idRepositorioEstrutura); - $totalDeRegistros = is_null($estruturasUnidades) ? 0 : count($estruturasUnidades); - } - - if (is_null($estruturasUnidades)) { - $result = $this->buscarListaEstruturas(array( - [ - 'idRepositorioEstrutura' => $idRepositorioEstrutura, - 'nome' => $nome, - 'numeroDeIdentificacaoDaEstruturaRaizDaConsulta' => $numeroDeIdentificacaoDaEstruturaRaizDaConsulta, - 'nomeUnidade' => $nomeUnidade, - 'siglaUnidade' => $siglaUnidade, - 'offset' => $offset, - 'registrosPorPagina' => $registrosPorPagina, - 'parBolPermiteRecebimento' => $parBolPermiteRecebimento, - 'parBolPermiteEnvio' => $parBolPermiteEnvio - ] - )); - - $totalDeRegistros = $result->estruturasEncontradas->totalDeRegistros; - if ($totalDeRegistros > 0 && !is_array($result->estruturasEncontradas->estrutura)) { - $result->estruturasEncontradas->estrutura = array($result->estruturasEncontradas->estrutura); - } - $estruturasUnidades = $result->estruturasEncontradas->estrutura; - } - - if ($totalDeRegistros > 0) { - foreach ($estruturasUnidades as $estrutura) { - $item = new EstruturaDTO(); - $item->setNumNumeroDeIdentificacaoDaEstrutura($estrutura->numeroDeIdentificacaoDaEstrutura); - $item->setStrNome(mb_convert_encoding($estrutura->nome, 'ISO-8859-1', 'UTF-8')); - $item->setStrSigla(mb_convert_encoding($estrutura->sigla, 'ISO-8859-1', 'UTF-8')); - $item->setBolAtivo($estrutura->ativo); - $item->setBolAptoParaReceberTramites($estrutura->aptoParaReceberTramites); - $item->setStrCodigoNoOrgaoEntidade($estrutura->codigoNoOrgaoEntidade); - $item->setNumTotalDeRegistros($totalDeRegistros); - - if (!empty($estrutura->hierarquia->nivel)) { - $array = array(); - foreach ($estrutura->hierarquia->nivel as $nivel) { - $array[] = mb_convert_encoding($nivel->sigla, 'ISO-8859-1', 'UTF-8'); - } - $item->setArrHierarquia($array); + throw new InfraException('Repositório de Estruturas inválido'); + } + + $parametros = [ + 'apenasAtivas' => true, + 'identificacaoDoRepositorioDeEstruturas' => $idRepositorioEstrutura, + 'sigla' => $siglaUnidade, + 'nome' => $nomeUnidade, + 'permiteRecebimento' => $parBolPermiteRecebimento, + 'permiteEnvio' => $parBolPermiteEnvio, + 'numeroDeIdentificacaoDaEstruturaRaizDaConsulta' => $numeroDeIdentificacaoDaEstruturaRaizDaConsulta ?: $nome, + 'registroInicial' => $offset, + 'quantidadeDeRegistros' => $registrosPorPagina, + ]; + + $arrResultado = $this->consultarEstruturas($idRepositorioEstrutura, $parametros); + + if ($arrResultado['totalDeRegistros'] > 0) { + + foreach ($arrResultado['estruturas'] as $estrutura) { + $objEstruturaDTO = new EstruturaDTO(); + $objEstruturaDTO->setNumNumeroDeIdentificacaoDaEstrutura($estrutura['numeroDeIdentificacaoDaEstrutura']); + $objEstruturaDTO->setStrNome(mb_convert_encoding($estrutura['nome'], 'ISO-8859-1', 'UTF-8')); + $objEstruturaDTO->setStrSigla(mb_convert_encoding($estrutura['sigla'], 'ISO-8859-1', 'UTF-8')); + $objEstruturaDTO->setBolAtivo($estrutura['ativo']); + $objEstruturaDTO->setBolAptoParaReceberTramites($estrutura['aptoParaReceberTramites']); + $objEstruturaDTO->setStrCodigoNoOrgaoEntidade($estrutura['codigoNoOrgaoEntidade']); + $objEstruturaDTO->setNumTotalDeRegistros($arrResultado['totalDeRegistros']); + + $arrHerarquia = array_map(function ($nivel) { + return mb_convert_encoding($nivel['sigla'], 'ISO-8859-1', 'UTF-8'); + }, $estrutura['hierarquia'] ?: []); + + $objEstruturaDTO->setArrHierarquia($arrHerarquia); + + $arrObjEstruturaDTO[] = $objEstruturaDTO; } - - $arrObjEstruturaDTO[] = $item; } - } } catch (Exception $e) { - $mensagem = "Falha na obtenção de unidades externas"; - $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); - throw new InfraException($mensagem, $e, $detalhes); + $mensagem = "Falha na obtenção de unidades externas"; + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + throw new InfraException($mensagem, $e, $detalhes); } - return $arrObjEstruturaDTO; + return $arrObjEstruturaDTO; } - + private function buscarListaEstruturas( $idRepositorioEstrutura, $filtro = array() @@ -656,149 +674,102 @@ private function buscarListaEstruturas( } public function listarEstruturasAutoCompletar( - $idRepositorioEstrutura, - $nome = '', - $numeroDeIdentificacaoDaEstruturaRaizDaConsulta = null, - $nomeUnidade = null, - $siglaUnidade = null, - $offset = null, - $registrosPorPagina = null, - $parBolPermiteRecebimento = null, - $parBolPermiteEnvio = null - ) { - $arrObjEstruturaDTO = array('diferencaDeRegistros' => 0, 'itens' => array()); - + $idRepositorioEstrutura, + $nome = '', + $numeroDeIdentificacaoDaEstruturaRaizDaConsulta = null, + $nomeUnidade = null, + $siglaUnidade = null, + $offset = null, + $registrosPorPagina = null, + $parBolPermiteRecebimento = null, + $parBolPermiteEnvio = null + ) { + $arrObjEstruturaDTO = array('diferencaDeRegistros' => 0, 'itens' => array()); + try { - $idRepositorioEstrutura = filter_var($idRepositorioEstrutura, FILTER_SANITIZE_NUMBER_INT); + $idRepositorioEstrutura = filter_var($idRepositorioEstrutura, FILTER_SANITIZE_NUMBER_INT); if (!$idRepositorioEstrutura) { throw new InfraException("Repositório de Estruturas inválido"); } - - $parametros = new stdClass(); - $parametros->filtroDeEstruturas = new stdClass(); - $parametros->filtroDeEstruturas->identificacaoDoRepositorioDeEstruturas = $idRepositorioEstrutura; - $parametros->filtroDeEstruturas->apenasAtivas = true; - - if (!is_null($numeroDeIdentificacaoDaEstruturaRaizDaConsulta)) { - $parametros->filtroDeEstruturas->numeroDeIdentificacaoDaEstruturaRaizDaConsulta = $numeroDeIdentificacaoDaEstruturaRaizDaConsulta; - } else { - $nome = trim($nome); - if (is_numeric($nome)) { - $parametros->filtroDeEstruturas->numeroDeIdentificacaoDaEstrutura = intval($nome); - } else { - $parametros->filtroDeEstruturas->nome = mb_convert_encoding($nome, 'UTF-8', 'ISO-8859-1'); - } - } - - if (!is_null($siglaUnidade)) { - $parametros->filtroDeEstruturas->sigla = $siglaUnidade; - } - - if (!is_null($nomeUnidade)) { - $parametros->filtroDeEstruturas->nome = mb_convert_encoding($nomeUnidade, 'UTF-8', 'ISO-8859-1'); - } - - if (!is_null($registrosPorPagina) && !is_null($offset)) { - $parametros->filtroDeEstruturas->paginacao = new stdClass(); - $parametros->filtroDeEstruturas->paginacao->registroInicial = $offset; - $parametros->filtroDeEstruturas->paginacao->quantidadeDeRegistros = $registrosPorPagina; - } - - if (!is_null($parBolPermiteRecebimento) && $parBolPermiteRecebimento === true) { - $parametros->filtroDeEstruturas->permiteRecebimento = true; - } - - if (!is_null($parBolPermiteEnvio) && $parBolPermiteEnvio === true) { - $parametros->filtroDeEstruturas->permiteEnvio = true; - } - - $result = $this->tentarNovamenteSobErroHTTP(function ($objPenWs) use ($parametros) { - return $objPenWs->consultarEstruturas($parametros); - }); - - if ($result->estruturasEncontradas->totalDeRegistros > 0) { - - if (!is_array($result->estruturasEncontradas->estrutura)) { - $result->estruturasEncontradas->estrutura = array($result->estruturasEncontradas->estrutura); - } - - foreach ($result->estruturasEncontradas->estrutura as $estrutura) { - $item = new EstruturaDTO(); - $item->setNumNumeroDeIdentificacaoDaEstrutura($estrutura->numeroDeIdentificacaoDaEstrutura); - $item->setStrNome(mb_convert_encoding($estrutura->nome, 'ISO-8859-1', 'UTF-8')); - $item->setStrSigla(mb_convert_encoding($estrutura->sigla, 'ISO-8859-1', 'UTF-8')); - $item->setBolAtivo($estrutura->ativo); - $item->setBolAptoParaReceberTramites($estrutura->aptoParaReceberTramites); - $item->setStrCodigoNoOrgaoEntidade($estrutura->codigoNoOrgaoEntidade); - $item->setNumTotalDeRegistros($result->estruturasEncontradas->totalDeRegistros); - - if (!empty($estrutura->hierarquia->nivel)) { - $array = array(); - foreach ($estrutura->hierarquia->nivel as $nivel) { - $array[] = mb_convert_encoding($nivel->sigla, 'ISO-8859-1', 'UTF-8'); - } - $item->setArrHierarquia($array); - } - - $arrObjEstruturaDTO["itens"][] = $item; - } - $totalDeRegistros = $result->estruturasEncontradas->totalDeRegistros; + $parametros = [ + 'identificacaoDoRepositorioDeEstruturas' => $idRepositorioEstrutura, + 'apenasAtivas' => true, + 'numeroDeIdentificacaoDaEstruturaRaizDaConsulta' => $numeroDeIdentificacaoDaEstruturaRaizDaConsulta, + 'sigla' => $siglaUnidade ?: null, + 'nome' => !is_null($nomeUnidade) ? mb_convert_encoding($nomeUnidade, 'UTF-8') : (is_null($numeroDeIdentificacaoDaEstruturaRaizDaConsulta) && !is_null($nome) ? (is_numeric($nome) ? intval($nome) : mb_convert_encoding($nome, 'UTF-8')) : null), + 'registroInicial' => !is_null($registrosPorPagina) && !is_null($offset) ? $offset : null, + 'quantidadeDeRegistros' => !is_null($registrosPorPagina) && !is_null($offset) ? $registrosPorPagina : null, + 'permiteRecebimento' => $parBolPermiteRecebimento ?: null, + 'permiteEnvio' => $parBolPermiteEnvio ?: null + ]; + + $parametros = array_filter($parametros, function($value) { + return !is_null($value); + }); + + $arrResultado = $this->consultarEstruturas($idRepositorioEstrutura, $parametros); + + if ($arrResultado['totalDeRegistros'] > 0) { + foreach ($arrResultado['estruturas'] as $estrutura) { + + $objEstruturaDTO = new EstruturaDTO(); + $objEstruturaDTO->setNumNumeroDeIdentificacaoDaEstrutura($estrutura['numeroDeIdentificacaoDaEstrutura']); + $objEstruturaDTO->setStrNome(mb_convert_encoding($estrutura['nome'], 'UTF-8')); + $objEstruturaDTO->setStrSigla(mb_convert_encoding($estrutura['sigla'], 'UTF-8')); + $objEstruturaDTO->setBolAtivo($estrutura['ativo']); + $objEstruturaDTO->setBolAptoParaReceberTramites($estrutura['aptoParaReceberTramites']); + $objEstruturaDTO->setStrCodigoNoOrgaoEntidade($estrutura['codigoNoOrgaoEntidade']); + $objEstruturaDTO->setNumTotalDeRegistros($arrResultado['totalDeRegistros']); + + $arrHerarquia = array_map(function($nivel) { + return mb_convert_encoding($nivel['sigla'], 'UTF-8'); + }, $estrutura['hierarquia'] ?: []); + + $objEstruturaDTO->setArrHierarquia($arrHerarquia); + + $arrObjEstruturaDTO["itens"][] = $objEstruturaDTO; + } + + $totalDeRegistros = $arrResultado['totalDeRegistros']; $arrObjEstruturaDTO["diferencaDeRegistros"] = $totalDeRegistros > count($arrObjEstruturaDTO["itens"]) ? - $totalDeRegistros - count($arrObjEstruturaDTO["itens"]) : 0; + $totalDeRegistros - count($arrObjEstruturaDTO["itens"]) : 0; } } catch (Exception $e) { - $mensagem = "Falha na obtenção de unidades externas"; - $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); - throw new InfraException($mensagem, $e, $detalhes); + $mensagem = "Falha na obtenção de unidades externas"; + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + throw new InfraException($mensagem, $e, $detalhes); } - - return $arrObjEstruturaDTO; + + return $arrObjEstruturaDTO; } + public function consultarMotivosUrgencia() { - $curl = curl_init($this->strComumXSD); - - try{ - $bolEmProducao = boolval(ConfiguracaoSEI::getInstance()->getValor('SEI', 'Producao')); - curl_setopt($curl, CURLOPT_URL, $this->strComumXSD); - curl_setopt($curl, CURLOPT_HEADER, false); - curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); - curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); - curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, $bolEmProducao); - curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, $bolEmProducao); - curl_setopt($curl, CURLOPT_SSLCERT, $this->strLocalCert); - curl_setopt($curl, CURLOPT_SSLCERTPASSWD, $this->strLocalCertPassword); - - $output = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($curl) { - return curl_exec($curl); - }); - - $dom = new DOMDocument(); - $dom->loadXML($output); - - $xpath = new DOMXPath($dom); - - $rootNamespace = $dom->lookupNamespaceUri($dom->namespaceURI); - $xpath->registerNamespace('x', $rootNamespace); - $entries = $xpath->query('/x:schema/x:simpleType[@name="motivoDaUrgencia"]/x:restriction/x:enumeration'); - - $resultado = array(); - foreach ($entries as $entry) { - $valor = $entry->getAttribute('value'); - $documentationNode = $xpath->query('x:annotation/x:documentation', $entry); - $descricao = $documentationNode->item(0)->nodeValue; - $resultado[$valor] = mb_convert_encoding($descricao, 'ISO-8859-1', 'UTF-8'); + $endpoint = 'motivosUrgencia'; + try { + $parametros = []; + + $arrResultado = $this->get($endpoint, $parametros); + $arrMotivosUrgencia = []; + if (isset($arrResultado)) { + $count = count($arrResultado['motivosUrgencia']); + + for ($i = 0; $i < $count; $i++) { + $arrMotivosUrgencia[] = mb_convert_encoding($arrResultado['motivosUrgencia'][$i]['descricao'], 'ISO-8859-1', 'UTF-8'); + } } - } finally{ - curl_close($curl); + + } catch (Exception $e) { + $mensagem = "Falha na obtenção de unidades externas"; + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + throw new InfraException($mensagem, $e, $detalhes); } - - return $resultado; + + return $arrMotivosUrgencia; } - /** * Busca as espécies documentais aceitas pelo Barramento de Serviços do PEN * @@ -808,73 +779,49 @@ public function consultarMotivosUrgencia() */ public function consultarEspeciesDocumentais() { - $curl = curl_init($this->strComumXSD); - - try{ - curl_setopt($curl, CURLOPT_URL, $this->strComumXSD); - curl_setopt($curl, CURLOPT_HEADER, 0); - curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); - curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); - - if(!ConfiguracaoSEI::getInstance()->getValor('SEI', 'Producao')){ - curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); - curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); + $endpoint = 'especies'; + try { + $parametros = []; + + $arrResultado = $this->get($endpoint, $parametros); + $arrEspecies = []; + if (isset($arrResultado)) { + $count = count($arrResultado['especies']); + + for ($i = 0; $i < $count; $i++) { + $arrEspecies[] = mb_convert_encoding($arrResultado['especies'][$i]['nomeNoProdutor'], 'ISO-8859-1', 'UTF-8'); + } } - curl_setopt($curl, CURLOPT_SSLCERT, $this->strLocalCert); - curl_setopt($curl, CURLOPT_SSLCERTPASSWD, $this->strLocalCertPassword); - - $output = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($curl) { - return curl_exec($curl); - }); - $dom = new DOMDocument(); - $dom->loadXML($output); - - $xpath = new DOMXPath($dom); - $rootNamespace = $dom->lookupNamespaceUri($dom->namespaceURI); - $xpath->registerNamespace('x', $rootNamespace); - $entries = $xpath->query('/x:schema/x:complexType[@name="especie"]/x:sequence/x:element[@name="codigo"]/x:simpleType/x:restriction/x:enumeration'); - if (count($entries) == 0){ - $erro_curl = empty(curl_error($curl))?'Não houve':curl_error($curl); - throw new InfraException("Não foi achado nenhuma espécie documental. Favor checar a configuração. Possível erro do curl: ".$erro_curl); - } - $resultado = array(); - foreach ($entries as $entry) { - $valor = $entry->getAttribute('value'); - $documentationNode = $xpath->query('x:annotation/x:documentation', $entry); - $descricao = $documentationNode->item(0)->nodeValue; - $resultado[$valor] = mb_convert_encoding($descricao, 'ISO-8859-1', 'UTF-8'); - } - } finally{ - curl_close($curl); + } catch (Exception $e) { + $mensagem = "Não foi encontrado nenhuma espécie documental."; + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + throw new InfraException($mensagem, $e, $detalhes); } - return $resultado; + return $arrEspecies; } - - public function enviarProcesso($parametros) - { + public function enviarProcessoREST($parametros) + { + $endpoint = "tramites/processo"; try { - return $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - return $objPenWs->enviarProcesso($parametros); - }); + $arrResultado = $this->post($endpoint, $parametros['novoTramiteDeProcesso']); + + return $arrResultado; + + } catch (Exception $e) { - } catch (\SoapFault $e) { - $strMensagem = str_replace(array("\n", "\r"), ' ', InfraString::formatarJavaScript(mb_convert_encoding($e->faultstring, 'ISO-8859-1', 'UTF-8'))); - - if ($e instanceof \SoapFault && !empty($e->detail->interoperabilidadeException->codigoErro) && $e->detail->interoperabilidadeException->codigoErro == '0005') { - $strMensagem .= 'O código mapeado para a unidade ' . mb_convert_encoding($parametros->novoTramiteDeProcesso->processo->documento[0]->produtor->unidade->nome, 'ISO-8859-1', 'UTF-8') . ' está incorreto.'; + $mensagem = "Falha no envio externo do processo. Verifique log de erros do sistema para maiores informações."; + $erroRequest = json_decode($e->getMessage()); + if ($erroRequest != null) { + $mensagem = "Falha no envio externo do processo. Erro: {$erroRequest->codigoErro} - {$erroRequest->message}"; } + $mensagem = mb_convert_encoding($mensagem, 'ISO-8859-1', 'UTF-8'); - $e->faultstring = $this->validarTramitaEmAndamento($parametros, $strMensagem); - $strMensagem = $e->faultstring; - $strDetalhes = str_replace(array("\n", "\r"), ' ', InfraString::formatarJavaScript($this->tratarFalhaWebService($e))); - throw new InfraException($strMensagem, $e, $strDetalhes); - } catch (\Exception $e) { - $mensagem = "Falha no envio externo do processo. Verifique log de erros do sistema para maiores informações."; $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); throw new InfraException($mensagem, $e, $detalhes); + } } @@ -898,29 +845,26 @@ private function validarTramitaEmAndamento($parametros, $strMensagem) public function listarPendencias($bolTodasPendencias) { - $arrObjPendenciaDTO = array(); + $endpoint = 'tramites/pendentes'; + $arrObjPendenciaDTO = []; try { - $parametros = new stdClass(); - $parametros->filtroDePendencias = new stdClass(); - $parametros->filtroDePendencias->todasAsPendencias = $bolTodasPendencias; - $result = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - return $objPenWs->listarPendencias($parametros); - }); - - if(isset($result->listaDePendencias->IDT)){ - if(!is_array($result->listaDePendencias->IDT)) { - $result->listaDePendencias->IDT = array($result->listaDePendencias->IDT); - } + $parametros = [ + 'todas' => $bolTodasPendencias + ]; + + $arrResultado = $this->get($endpoint, $parametros); + + if (is_array($arrResultado) && !is_null($arrResultado)) { + foreach ($arrResultado as $strPendencia) { + $pendenciaDTO = new PendenciaDTO(); + $pendenciaDTO->setNumIdentificacaoTramite($strPendencia['IDT']); + $pendenciaDTO->setStrStatus($strPendencia['status']); + $arrObjPendenciaDTO[] = $pendenciaDTO; + } + } - foreach ($result->listaDePendencias->IDT as $idt) { - $item = new PendenciaDTO(); - $item->setNumIdentificacaoTramite($idt->_); - $item->setStrStatus($idt->status); - $arrObjPendenciaDTO[] = $item; - } - } - } catch (\Exception $e) { + } catch (Exception $e) { $mensagem = "Falha na listagem de pendências de trâmite de processos"; $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); throw new InfraException($mensagem, $e, $detalhes); @@ -931,13 +875,17 @@ public function listarPendencias($bolTodasPendencias) private function tratarFalhaWebService(Exception $fault) { + $mensagem = InfraException::inspecionar($fault); - if($fault instanceof SoapFault && isset($fault->detail->interoperabilidadeException)) { - $strWsException = $fault->detail->interoperabilidadeException; - $mensagem = mb_convert_encoding($strWsException->mensagem, 'ISO-8859-1', 'UTF-8'); + + if ($fault instanceof RequestException && $fault->hasResponse()) { + + $codigoErro = $fault->getResponse()->getStatusCode(); + $mensagemDoErro = $fault->getResponse()->getReasonPhrase(); + $mensagem = mb_convert_encoding($mensagem, 'ISO-8859-1', 'UTF-8'); // Fixação de mensagem de erro para quando já existe um trâmite em andamento - if($strWsException->codigoErro == "0044"){ + if ($codigoErro == "0044") { $mensagem = 'Processo já possui um trâmite em andamento.'; } } @@ -945,92 +893,100 @@ private function tratarFalhaWebService(Exception $fault) return $mensagem; } + public function construirCabecalho($strNumeroRegistro, $idRepositorioOrigem, $idUnidadeOrigem, $idRepositorioDestino, - $idUnidadeDestino, $urgente = false, $motivoUrgencia = 0, $enviarTodosDocumentos = false, $dblIdProcedimento = null) + $idUnidadeDestino, $urgente = false, $motivoUrgencia = 0, $enviarTodosDocumentos = false, $dblIdProcedimento = null) { - $cabecalho = new stdClass(); - if(isset($strNumeroRegistro)) { - $cabecalho->NRE = $strNumeroRegistro; - } + $cabecalho = [ + "remetente" => [ + "identificacaoDoRepositorioDeEstruturas" => $idRepositorioOrigem, + "numeroDeIdentificacaoDaEstrutura" => $idUnidadeOrigem, + ], + "destinatario" => [ + "identificacaoDoRepositorioDeEstruturas" => $idRepositorioDestino, + "numeroDeIdentificacaoDaEstrutura" => $idUnidadeDestino, + ], + "enviarApenasComponentesDigitaisPendentes" => !$enviarTodosDocumentos + ]; + + if (isset($urgente) && !empty($urgente)) { + $cabecalho['urgencia'] = $urgente; + } + + if (isset($motivoUrgencia) && !empty($motivoUrgencia)) { + $cabecalho['motivoDaUrgencia'] = $urgente; + } - $cabecalho->remetente = new stdClass(); - $cabecalho->remetente->identificacaoDoRepositorioDeEstruturas = $idRepositorioOrigem; - $cabecalho->remetente->numeroDeIdentificacaoDaEstrutura = $idUnidadeOrigem; + if (isset($strNumeroRegistro) && !empty($strNumeroRegistro)) { + $cabecalho['NRE'] = $strNumeroRegistro; + } - $cabecalho->destinatario = new stdClass(); - $cabecalho->destinatario->identificacaoDoRepositorioDeEstruturas = $idRepositorioDestino; - $cabecalho->destinatario->numeroDeIdentificacaoDaEstrutura = $idUnidadeDestino; - $cabecalho->urgente = $urgente; - $cabecalho->motivoDaUrgencia = $motivoUrgencia; - //Parâmetro abaixo foi descontinuado por falhas e substituido pelo enviarApenasComponentesDigitaisPendentes - $cabecalho->enviarApenasComponentesDigitaisPendentes = !$enviarTodosDocumentos; + $atribuirInformacoes = $this->atribuirInformacoesAssuntoREST($cabecalho, $dblIdProcedimento); + $atribuirInfoModulo = $this->atribuirInformacoesModuloREST($cabecalho); - $this->atribuirInformacoesAssunto($cabecalho, $dblIdProcedimento); - $this->atribuirInformacoesModulo($cabecalho); + $cabecalho['propriedadesAdicionais'] = array_merge($atribuirInformacoes, $atribuirInfoModulo); return $cabecalho; } - private function atribuirInformacoesModulo($objCabecalho) + private function atribuirInformacoesModuloREST($objCabecalho) { - try{ + $arrInformacoeesModulo = []; + $objInfraParametro = new InfraParametro(BancoSEI::getInstance()); + + $arrInformacoeesModulo[] = [ + 'chave' => 'MODULO_PEN_VERSAO', + 'valor' => $objInfraParametro->getValor('VERSAO_MODULO_PEN') + ]; - $objInfraParametro = new InfraParametro($this->inicializarObjInfraIBanco()); - $arrPropAdicionais=$objCabecalho->propriedadeAdicional; - $arrPropAdicionais[] = new SoapVar("". $objInfraParametro->getValor('VERSAO_MODULO_PEN') . "", XSD_ANYXML); - - $objCabecalho->propriedadeAdicional= $arrPropAdicionais; + return $arrInformacoeesModulo; }catch(Exception $e){ - + $mensagem = "Erro ao obter versão do módulo PEN"; throw new InfraException($mensagem, $e); } - - } - private function atribuirInformacoesAssunto($objCabecalho, $dblIdProcedimento) - { + private function atribuirInformacoesAssuntoREST($objCabecalho, $dblIdProcedimento) + { try{ - if(!isset($dblIdProcedimento)){ - throw new InfraException('Parâmetro $dblIdProcedimento não informado.'); + throw new InfraException('Parâmetro $dblIdProcedimento não informado.'); } - $objRelProtocoloAssuntoDTO = new RelProtocoloAssuntoDTO(); - $objRelProtocoloAssuntoDTO->setDblIdProtocolo($dblIdProcedimento); - $objRelProtocoloAssuntoDTO->retStrDescricaoAssunto(); - $objRelProtocoloAssuntoDTO->retNumIdAssunto(); - $objRelProtocoloAssuntoDTO->setOrdNumSequencia(InfraDTO::$TIPO_ORDENACAO_ASC); + $objRelProtocoloAssuntoDTO = new RelProtocoloAssuntoDTO(); + $objRelProtocoloAssuntoDTO->setDblIdProtocolo($dblIdProcedimento); + $objRelProtocoloAssuntoDTO->retStrDescricaoAssunto(); + $objRelProtocoloAssuntoDTO->retNumIdAssunto(); + $objRelProtocoloAssuntoDTO->setOrdNumSequencia(InfraDTO::$TIPO_ORDENACAO_ASC); - $objRelProtocoloAssuntoRN = new RelProtocoloAssuntoRN(); - $arrobjRelProtocoloAssuntoDTO = $objRelProtocoloAssuntoRN->listarRN0188($objRelProtocoloAssuntoDTO); + $objRelProtocoloAssuntoRN = new RelProtocoloAssuntoRN(); + $arrobjRelProtocoloAssuntoDTO = $objRelProtocoloAssuntoRN->listarRN0188($objRelProtocoloAssuntoDTO); - $arrDadosAssunto = array(); - $contagem=1; - $objProcessoEletronicoRN = new ProcessoEletronicoRN(); + $arrDadosAssunto = array(); + $contagem=1; + $objProcessoEletronicoRN = new ProcessoEletronicoRN(); foreach ($arrobjRelProtocoloAssuntoDTO as $objRelProtocoloAssuntoDTO) { - $idAssunto = $objRelProtocoloAssuntoDTO->getNumIdAssunto(); - $assuntoDTO = new AssuntoDTO(); - $assuntoDTO->setNumIdAssunto($idAssunto); - $assuntoDTO->retNumPrazoCorrente(); - $assuntoDTO->retNumPrazoIntermediario(); - $assuntoDTO->retStrStaDestinacao(); - $assuntoDTO->retStrObservacao(); - $assuntoDTO->retStrCodigoEstruturado(); + $idAssunto = $objRelProtocoloAssuntoDTO->getNumIdAssunto(); + $assuntoDTO = new AssuntoDTO(); + $assuntoDTO->setNumIdAssunto($idAssunto); + $assuntoDTO->retNumPrazoCorrente(); + $assuntoDTO->retNumPrazoIntermediario(); + $assuntoDTO->retStrStaDestinacao(); + $assuntoDTO->retStrObservacao(); + $assuntoDTO->retStrCodigoEstruturado(); - $objAssuntoRN = new AssuntoRN(); - $infoAssunto = $objAssuntoRN->consultarRN0256($assuntoDTO); + $objAssuntoRN = new AssuntoRN(); + $infoAssunto = $objAssuntoRN->consultarRN0256($assuntoDTO); switch ($infoAssunto->getStrStaDestinacao()) { case AssuntoRN::$TD_ELIMINACAO: @@ -1038,43 +994,66 @@ private function atribuirInformacoesAssunto($objCabecalho, $dblIdProcedimento) break; case AssuntoRN::$TD_GUARDA_PERMANENTE: - $destinacao = "Guarda Permanente"; + $destinacao = "Guarda Permanente"; break; } + $valorInput = $objRelProtocoloAssuntoDTO->getStrDescricaoAssunto() ? + utf8_encode($objProcessoEletronicoRN->reduzirCampoTexto(htmlspecialchars($objRelProtocoloAssuntoDTO->getStrDescricaoAssunto(), ENT_COMPAT | ENT_HTML401 | ENT_SUBSTITUTE, 'ISO-8859-1'), 10000)) + : "NA"; - $valorInput=$objRelProtocoloAssuntoDTO->getStrDescricaoAssunto()?mb_convert_encoding($objProcessoEletronicoRN->reduzirCampoTexto(htmlspecialchars($objRelProtocoloAssuntoDTO->getStrDescricaoAssunto(), ENT_COMPAT | ENT_HTML401 | ENT_SUBSTITUTE, 'ISO-8859-1'), 10000), 'UTF-8', 'ISO-8859-1'):"NA"; - $arrDadosAssunto[] = new SoapVar("" . $valorInput . "", XSD_ANYXML); - - $valorInput=$infoAssunto->getStrCodigoEstruturado()?mb_convert_encoding($infoAssunto->getStrCodigoEstruturado(), 'UTF-8', 'ISO-8859-1'):"NA"; - $arrDadosAssunto[] = new SoapVar("" . $valorInput . "", XSD_ANYXML); - - $valorInput=$infoAssunto->getNumPrazoCorrente()? (int) $infoAssunto->getNumPrazoCorrente() :"NA"; - $arrDadosAssunto[] = new SoapVar("" . $valorInput . "", XSD_ANYXML); - - $valorInput=$infoAssunto->getNumPrazoIntermediario()?(int) $infoAssunto->getNumPrazoIntermediario():"NA"; - $arrDadosAssunto[] = new SoapVar("" . $valorInput . "", XSD_ANYXML); - - $valorInput=$destinacao?mb_convert_encoding($destinacao, 'UTF-8', 'ISO-8859-1'):"NA"; - $arrDadosAssunto[] = new SoapVar("" . $valorInput . "", XSD_ANYXML); - - $valorInput=$infoAssunto->getStrObservacao()?mb_convert_encoding($objProcessoEletronicoRN->reduzirCampoTexto(htmlspecialchars($infoAssunto->getStrObservacao(), ENT_COMPAT | ENT_HTML401 | ENT_SUBSTITUTE, 'ISO-8859-1'), 10000), 'UTF-8', 'ISO-8859-1'):"NA"; - $arrDadosAssunto[] = new SoapVar("" . $valorInput . "", XSD_ANYXML); - + $arrDadosAssunto[] = [ + 'chave' => 'CLASSIFICACAO_Descricao_' . $contagem, + 'valor' => $valorInput + ]; + + $valorInput = $infoAssunto->getStrCodigoEstruturado() ? + utf8_encode($infoAssunto->getStrCodigoEstruturado()) + : "NA"; + $arrDadosAssunto[] = [ + 'chave' => 'CLASSIFICACAO_CodigoEstruturado_' . $contagem, + 'valor' => $valorInput + ]; + + $valorInput = $infoAssunto->getNumPrazoCorrente() ? + (int) $infoAssunto->getNumPrazoCorrente() + : "NA"; + $arrDadosAssunto[] = [ + 'chave' => 'CLASSIFICACAO_PrazoCorrente_' . $contagem, + 'valor' => $valorInput + ]; + + $valorInput = $infoAssunto->getNumPrazoIntermediario() ? + (int) $infoAssunto->getNumPrazoIntermediario() + : "NA"; + $arrDadosAssunto[] = [ + 'chave' => 'CLASSIFICACAO_PrazoIntermediario_' . $contagem, + 'valor' => $valorInput + ]; + + $valorInput = $destinacao ? + utf8_encode($destinacao) + : "NA"; + $arrDadosAssunto[] = [ + 'chave' => 'CLASSIFICACAO_Destinacao_' . $contagem, + 'valor' => $valorInput + ]; + + $valorInput = $infoAssunto->getStrObservacao() ? + mb_convert_encoding($objProcessoEletronicoRN->reduzirCampoTexto(htmlspecialchars($infoAssunto->getStrObservacao(), ENT_COMPAT | ENT_HTML401 | ENT_SUBSTITUTE, 'ISO-8859-1'), 10000), 'UTF-8', 'ISO-8859-1') + : "NA"; + $arrDadosAssunto[] = [ + 'chave' => 'CLASSIFICACAO_Observacao_' . $contagem, + 'valor' => $valorInput + ]; - $contagem++; + $contagem++; } - $objCabecalho->propriedadeAdicional= $arrDadosAssunto; + return $arrDadosAssunto; }catch(Exception $e){ - + $mensagem = "Falha ao atribuir informações de assunto"; throw new InfraException($mensagem, $e); } @@ -1083,9 +1062,53 @@ private function atribuirInformacoesAssunto($objCabecalho, $dblIdProcedimento) public function enviarComponenteDigital($parametros) { try { - return $this->tentarNovamenteSobErroHTTP(function($objPenWs) use (&$parametros) { - return $objPenWs->enviarComponenteDigital($parametros); - }); + + $objParametros = $parametros->dadosDoComponenteDigital; + $idTicketDeEnvio = $objParametros->ticketParaEnvioDeComponentesDigitais; + + $protocolo = $objParametros->protocolo; + $hashDoComponenteDigital = $objParametros->hashDoComponenteDigital; + $conteudo = $objParametros->conteudoDoComponenteDigital; + + $queryParams = [ + 'hashDoComponenteDigital' => $hashDoComponenteDigital, + 'protocolo' => $protocolo + ]; + + $endpoint = "tickets-de-envio-de-componente/{$idTicketDeEnvio}/protocolos/componentes-a-enviar"; + + $objConfiguracaoModPEN = ConfiguracaoModPEN::getInstance(); + $strLocalizacaoCertificadoDigital = $objConfiguracaoModPEN->getValor("PEN", "LocalizacaoCertificado"); + $strSenhaCertificadoDigital = $objConfiguracaoModPEN->getValor("PEN", "SenhaCertificado"); + + $strBaseUri = $this->strEnderecoWebService; + + $arrheaders = [ + 'Accept' => '*/*', + ]; + + $strClientGuzzle = new GuzzleHttp\Client([ + 'base_uri' => $strBaseUri, + 'headers' => $arrheaders, + 'timeout' => self::WS_TIMEOUT_CONEXAO, + 'cert' => [$strLocalizacaoCertificadoDigital, $strSenhaCertificadoDigital], + ]); + + + $arrOptions = [ + 'query' => $queryParams, + 'multipart' => [ + [ + 'name' => 'conteudo', + 'contents' => $conteudo, + 'filename' => 'conteudo.html', + 'headers' => ['Content-Type' => 'text/html'] + ], + ], + ]; + + $strClientGuzzle->request('PUT', $endpoint, $arrOptions); + } catch (\Exception $e) { $mensagem = "Falha no envio de componentes digitais"; $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); @@ -1093,7 +1116,6 @@ public function enviarComponenteDigital($parametros) } } - /** * Método responsável por realizar o envio da parte de um componente digital * @param $parametros @@ -1103,12 +1125,63 @@ public function enviarComponenteDigital($parametros) public function enviarParteDeComponenteDigital($parametros) { try { - return $this->tentarNovamenteSobErroHTTP(function($objPenWs) use (&$parametros) { - return $objPenWs->enviarParteDeComponenteDigital($parametros); - }); + + $objParametros = $parametros->dadosDaParteDeComponenteDigital; + $idTicketDeEnvio = $objParametros->ticketParaEnvioDeComponentesDigitais; + + $protocolo = $objParametros->protocolo; + $hashDoComponenteDigital = $objParametros->hashDoComponenteDigital; + + $indetificacaoDaParte = $objParametros->identificacaoDaParte; + $parte = $indetificacaoDaParte->inicio . '-' . $indetificacaoDaParte->fim; + + $conteudo = $objParametros->conteudoDaParteDeComponenteDigital; + + $queryParams = [ + 'hashDoComponenteDigital' => $hashDoComponenteDigital, + 'protocolo' => $protocolo + ]; + + $endpoint = "tickets-de-envio-de-componente/{$idTicketDeEnvio}/protocolos/componentes-a-enviar/partes/{$parte}"; + + $objConfiguracaoModPEN = ConfiguracaoModPEN::getInstance(); + $strLocalizacaoCertificadoDigital = $objConfiguracaoModPEN->getValor("PEN", "LocalizacaoCertificado"); + $strSenhaCertificadoDigital = $objConfiguracaoModPEN->getValor("PEN", "SenhaCertificado"); + + $strBaseUri = $this->strEnderecoWebService; + + $arrheaders = [ + 'Accept' => '*/*', + 'Content-Type' => 'application/json', + ]; + + $strClientGuzzle = new GuzzleHttp\Client([ + 'base_uri' => $strBaseUri, + 'headers' => $arrheaders, + 'timeout' => self::WS_TIMEOUT_CONEXAO, + 'cert' => [$strLocalizacaoCertificadoDigital, $strSenhaCertificadoDigital], + ]); + + + $arrOptions = [ + 'query' => $queryParams, + 'multipart' => [ + [ + 'name' => 'conteudo', + 'contents' => $conteudo, + 'filename' => 'arquivo_externo.html', + // 'headers' => ['Content-Type' => 'text/html'] + ], + ], + ]; + + $strClientGuzzle->request('PUT', $endpoint, $arrOptions); } catch (\Exception $e) { - $mensagem = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); - throw new InfraException($mensagem, $e); + $erroResposta = json_decode($e->getResponse()->getBody()->getContents()); + $mensagem = "Falha de envio do componente digital. Erro: {$erroResposta->codigoErro} - {$erroResposta->mensagem}"; + $mensagem = mb_convert_encoding($mensagem, 'ISO-8859-1', 'UTF-8'); + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + throw new InfraException($mensagem, $e, $detalhes); } } @@ -1119,11 +1192,20 @@ public function enviarParteDeComponenteDigital($parametros) * @throws InfraException */ public function sinalizarTerminoDeEnvioDasPartesDoComponente($parametros) - { + { try { - return $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - return $objPenWs->sinalizarTerminoDeEnvioDasPartesDoComponente($parametros); - }); + $objParametros = $parametros->dadosDoTerminoDeEnvioDePartes; + $idTicketDeEnvio = $objParametros->ticketParaEnvioDeComponentesDigitais; + + $arrIdentificacaoDoComponenteDigital = [ + 'hashDoComponenteDigital' => $objParametros->hashDoComponenteDigital, + 'protocolo' => $objParametros->protocolo, + ]; + + $endpoint = "tickets-de-envio-de-componente/{$idTicketDeEnvio}/protocolos/componentes-a-enviar/partes/sinalizacao-termino-envio"; + + return $this->post($endpoint, $arrIdentificacaoDoComponenteDigital); + } catch (\Exception $e) { $mensagem = "Falha em sinalizar o término de envio das partes do componente digital"; $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); @@ -1131,16 +1213,39 @@ public function sinalizarTerminoDeEnvioDasPartesDoComponente($parametros) } } + public function solicitarMetadados($parNumIdentificacaoTramite) { + $endpoint = "tramites/{$parNumIdentificacaoTramite}"; try { - $parametros = new stdClass(); - $parametros->IDT = $parNumIdentificacaoTramite; - return $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - $objMetadadosProtocolo = $objPenWs->solicitarMetadados($parametros); - $objMetadadosProtocolo->IDT = $parametros->IDT; - return $objMetadadosProtocolo; - }); + $parametros = [ + 'IDT' => $parNumIdentificacaoTramite + ]; + + $arrResultado = $this->get($endpoint, $parametros); + + $arrResultado['IDT'] = $parNumIdentificacaoTramite; + $arrResultado['NRE'] = $arrResultado['nre']; + + $objResultado = new stdClass(); + $objResultado->IDT = $parNumIdentificacaoTramite; + $objResultado->NRE = $arrResultado['nre']; + + $multivalorado = false; + if (count($arrResultado['processo']['documentos']) <= 1) { + $arrResultado['processo']['documentos'] = (object) $arrResultado['processo']['documentos'][0]; + } else { + $multivalorado = true; + } + + $objResultado->metadados = $this->converterArrayParaObjeto($arrResultado); + + if ($multivalorado) { + $objResultado->metadados->processo->documentos = (array) $objResultado->metadados->processo->documentos; + } + + return $objResultado; + } catch (\Exception $e) { $mensagem = "Falha na solicitação de metadados do processo"; $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); @@ -1189,7 +1294,7 @@ public static function obterIdTarefaModulo($strIdTarefaModulo) public function cadastrarTramiteDeProcesso($parDblIdProcedimento, $parStrNumeroRegistro, $parNumIdentificacaoTramite, $parStrStaTipoTramite, $parDthRegistroTramite, $parNumIdRepositorioOrigem, $parNumIdEstruturaOrigem, $parNumIdRepositorioDestino, $parNumIdEstruturaDestino, $parObjProtocolo, $parNumTicketComponentesDigitais = null, $parObjComponentesDigitaisSolicitados = null, $bolSinProcessamentoEmBloco = false, $numIdUnidade = null) { - + // $parObjProtocolo if(!isset($parDblIdProcedimento) || $parDblIdProcedimento == 0) { throw new InfraException('Parâmetro $parDblIdProcedimento não informado.'); } @@ -1226,6 +1331,10 @@ public function cadastrarTramiteDeProcesso($parDblIdProcedimento, $parStrNumeroR throw new InfraException('Parâmetro $objProcesso não informado.'); } + if (is_array($parObjProtocolo)) { + $parObjProtocolo = (object) $parObjProtocolo; + } + //Monta dados do processo eletrônico $objProcessoEletronicoDTO = new ProcessoEletronicoDTO(); $objProcessoEletronicoDTO->setStrNumeroRegistro($parStrNumeroRegistro); @@ -1233,8 +1342,8 @@ public function cadastrarTramiteDeProcesso($parDblIdProcedimento, $parStrNumeroR $objProcessoEletronicoDTO->setStrStaTipoProtocolo($parObjProtocolo->staTipoProtocolo); //Montar dados dos procedimentos apensados - if(isset($parObjProtocolo->processoApensado)){ - if(!is_array($parObjProtocolo->processoApensado)){ + if (isset($parObjProtocolo->processoApensado)) { + if (!is_array($parObjProtocolo->processoApensado)) { $parObjProtocolo->processoApensado = array($parObjProtocolo->processoApensado); } @@ -1243,8 +1352,8 @@ public function cadastrarTramiteDeProcesso($parDblIdProcedimento, $parStrNumeroR foreach ($parObjProtocolo->processoApensado as $objProcessoApensado) { $objRelProcessoEletronicoApensadoDTO = new RelProcessoEletronicoApensadoDTO(); $objRelProcessoEletronicoApensadoDTO->setStrNumeroRegistro($parStrNumeroRegistro); - $objRelProcessoEletronicoApensadoDTO->setDblIdProcedimentoApensado($objProcessoApensado->idProcedimentoSEI); - $objRelProcessoEletronicoApensadoDTO->setStrProtocolo($objProcessoApensado->protocolo); + $objRelProcessoEletronicoApensadoDTO->setDblIdProcedimentoApensado($objProcessoApensado['idProcedimentoSEI']); + $objRelProcessoEletronicoApensadoDTO->setStrProtocolo($objProcessoApensado['protocolo']); $arrObjRelProcessoEletronicoApensadoDTO[] = $objRelProcessoEletronicoApensadoDTO; } @@ -1378,6 +1487,10 @@ protected function cadastrarTramiteDeProcessoInternoControlado(ProcessoEletronic */ public static function getHashFromMetaDados($objMeta) { + if (is_array($objMeta)) { + $objMeta = (object) $objMeta; + } + $strHashConteudo = ''; if (isset($objMeta)) { @@ -1385,7 +1498,7 @@ public static function getHashFromMetaDados($objMeta) $strHashConteudo = $objMeta; } else { $matches = array(); - $strHashConteudo = (isset($objMeta->enc_value)) ? $objMeta->enc_value : $objMeta->_; + $strHashConteudo = (isset($objMeta->enc_value)) ? $objMeta->enc_value : $objMeta->conteudo; if (preg_match('/^(.*)<\/hash>$/', $strHashConteudo, $matches, PREG_OFFSET_CAPTURE)) { $strHashConteudo = $matches[1][0]; @@ -1396,6 +1509,19 @@ public static function getHashFromMetaDados($objMeta) return $strHashConteudo; } + public static function getHashFromMetaDadosREST($objMeta) + { + $strHashConteudo = ''; + if (isset($objMeta)) { + if(is_string($objMeta)){ + $strHashConteudo = $objMeta; + } else { + $strHashConteudo = (isset($objMeta['conteudo'])) ? $objMeta['conteudo'] : $objMetaconteudo; + } + } + return $strHashConteudo; + } + private function montarDadosMaisDeUmComponenteDigital($objDocumento, $parStrNumeroRegistro, $parNumIdentificacaoTramite, $parObjProtocolo, $parObjComponentesDigitaisSolicitados) { $arrayComponentesDigitais = $objDocumento->componenteDigital; @@ -1465,7 +1591,7 @@ private function montarDadosComponenteDigital($parStrNumeroRegistro, $parNumIden $arrObjComponenteDigitalDTOAux = array(); foreach ($arrObjDocumento as $objDocumento) { - $quantidadeDeComponentesDigitais = count($objDocumento->componenteDigital); + $quantidadeDeComponentesDigitais = count($objDocumento->componentesDigitais); if($quantidadeDeComponentesDigitais > 1){ $arrObjComponenteDigitalDTOAux = self::montarDadosMaisDeUmComponenteDigital($objDocumento, $parStrNumeroRegistro, $parNumIdentificacaoTramite, $parObjProtocolo, $parObjComponentesDigitaisSolicitados); }else{ @@ -1490,16 +1616,17 @@ private function montarDadosComponenteDigital($parStrNumeroRegistro, $parNumIden } //Por enquanto, considera que o documento possui apenas um componente digital - if(is_array($objDocumento->componenteDigital) && count($objDocumento->componenteDigital) != 1) { + if(is_array($objDocumento->componentesDigitais) && count($objDocumento->componentesDigitais) != 1) { throw new InfraException("Erro processando componentes digitais do processo " . $parObjProtocolo->protocolo . "\n Somente é permitido o recebimento de documentos com apenas um Componente Digital."); } - $objComponenteDigital = is_array($objDocumento->componenteDigital) ? $objDocumento->componenteDigital[0] : $objDocumento->componenteDigital; - $objComponenteDigitalDTO->setStrNome(mb_convert_encoding($objComponenteDigital->nome, 'ISO-8859-1', 'UTF-8')); + $arrComponenteDigital = is_array($objDocumento->componentesDigitais) ? $objDocumento->componentesDigitais[0] : $objDocumento->componentesDigitais; + $objComponenteDigital = (object) $arrComponenteDigital; + $objComponenteDigitalDTO->setStrNome(utf8_decode($objComponenteDigital->nome)); if(isset($objDocumento->especie)){ $objComponenteDigitalDTO->setNumCodigoEspecie(intval($objDocumento->especie->codigo)); - $objComponenteDigitalDTO->setStrNomeEspecieProdutor(mb_convert_encoding($objDocumento->especie->nomeNoProdutor, 'ISO-8859-1', 'UTF-8')); + $objComponenteDigitalDTO->setStrNomeEspecieProdutor(utf8_decode($objDocumento->especie->nomeNoProdutor)); } $strHashConteudo = static::getHashFromMetaDados($objComponenteDigital->hash); @@ -1507,16 +1634,16 @@ private function montarDadosComponenteDigital($parStrNumeroRegistro, $parNumIden $objComponenteDigitalDTO->setStrAlgoritmoHash(self::ALGORITMO_HASH_DOCUMENTO); $objComponenteDigitalDTO->setStrTipoConteudo($objComponenteDigital->tipoDeConteudo); $objComponenteDigitalDTO->setStrMimeType($objComponenteDigital->mimeType); - $objComponenteDigitalDTO->setStrDadosComplementares($objComponenteDigital->dadosComplementaresDoTipoDeArquivo); + $objComponenteDigitalDTO->setStrDadosComplementares($objComponenteDigital->dadosComplementaresDoTipoDeArquivo); //Registrar componente digital necessita ser enviado pelo trâmite específico //TODO: Teste $parObjComponentesDigitaisSolicitados aqui if(isset($parObjComponentesDigitaisSolicitados)){ - $arrObjItensSolicitados = is_array($parObjComponentesDigitaisSolicitados->processo) ? $parObjComponentesDigitaisSolicitados->processo : array($parObjComponentesDigitaisSolicitados->processo); + $arrObjItensSolicitados = is_array($parObjComponentesDigitaisSolicitados) ? $parObjComponentesDigitaisSolicitados : array($parObjComponentesDigitaisSolicitados); foreach ($arrObjItensSolicitados as $objItemSolicitado) { if(!is_null($objItemSolicitado)){ - $objItemSolicitado->hash = is_array($objItemSolicitado->hash) ? $objItemSolicitado->hash : array($objItemSolicitado->hash); + $objItemSolicitado['hashes'] = is_array($objItemSolicitado['hashes']) ? $objItemSolicitado['hashes'] : array($objItemSolicitado['hashes']); - if($objItemSolicitado->protocolo == $objComponenteDigitalDTO->getStrProtocolo() && in_array($strHashConteudo, $objItemSolicitado->hash) && !$objDocumento->retirado) { + if($objItemSolicitado['protocolo'] == $objComponenteDigitalDTO->getStrProtocolo() && in_array($strHashConteudo, $objItemSolicitado['hashes']) && !$objDocumento->retirado) { $objComponenteDigitalDTO->setStrSinEnviar("S"); } } @@ -1526,7 +1653,10 @@ private function montarDadosComponenteDigital($parStrNumeroRegistro, $parNumIden //TODO: Avaliar dados do tamanho do documento em bytes salvo na base de dados $objComponenteDigitalDTO->setNumTamanho($objComponenteDigital->tamanhoEmBytes); + if (isset($objComponenteDigital->idAnexo)) { $objComponenteDigitalDTO->setNumIdAnexo($objComponenteDigital->idAnexo); + } + $arrObjComponenteDigitalDTO[] = $objComponenteDigitalDTO; } $arrObjComponenteDigitalDTO = array_merge($arrObjComponenteDigitalDTOAux, $arrObjComponenteDigitalDTO); @@ -1542,72 +1672,83 @@ private function montarDadosComponenteDigital($parStrNumeroRegistro, $parNumIden return $arrObjComponenteDigitalDTO; } + + public function receberComponenteDigital($parNumIdentificacaoTramite, $parStrHashComponenteDigital, $parStrProtocolo, $parObjParteComponente = null) { - try - { - $parametros = new stdClass(); - $parametros->parametrosParaRecebimentoDeComponenteDigital = new stdClass(); - $parametros->parametrosParaRecebimentoDeComponenteDigital->identificacaoDoComponenteDigital = new stdClass(); - $parametros->parametrosParaRecebimentoDeComponenteDigital->identificacaoDoComponenteDigital->IDT = $parNumIdentificacaoTramite; - $parametros->parametrosParaRecebimentoDeComponenteDigital->identificacaoDoComponenteDigital->protocolo = $parStrProtocolo; - $parametros->parametrosParaRecebimentoDeComponenteDigital->identificacaoDoComponenteDigital->hashDoComponenteDigital = $parStrHashComponenteDigital; - - //Se for passado o parametro $parObjParteComponente retorna apenas parte especifica do componente digital - if(!is_null($parObjParteComponente)){ - $parametros->parametrosParaRecebimentoDeComponenteDigital->parte = $parObjParteComponente; - } + $endpoint = "tramites/{$parNumIdentificacaoTramite}/protocolos/componentes-digitais"; + try { + $identificacaoDoComponenteDigital = [ + 'hashDoComponenteDigital' => $parStrHashComponenteDigital, + 'protocolo' => $parStrProtocolo, + ]; + + // Se for passado o parametro $parObjParteComponente retorna apenas parte especifica do componente digital + if (!is_null($parObjParteComponente)) { + $parte = $parObjParteComponente->inicio . '-' . $parObjParteComponente->fim; + $endpoint = "tramites/{$parNumIdentificacaoTramite}/protocolos/componentes-digitais/partes/{$parte}"; + } + + $strComponenteDigitalBase64 = $this->post($endpoint, $identificacaoDoComponenteDigital); + + $objResultado = new stdClass(); + $objResultado->conteudoDoComponenteDigital = new stdClass(); + $objResultado->conteudoDoComponenteDigital = base64_decode($strComponenteDigitalBase64); + + return $objResultado; - return $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - return $objPenWs->receberComponenteDigital($parametros); - }); - } catch (\SoapFault $fault) { - $mensagem = $this->tratarFalhaWebService($fault); - throw new InfraException(InfraString::formatarJavaScript($mensagem), $fault); } catch (\Exception $e) { - throw new InfraException("Error Processing Request", $e); + $mensagem = "Falha no recebimento do componente digital"; + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + throw new InfraException($mensagem, $e, $detalhes); } } public function consultarTramites($parNumIdTramite = null, $parNumeroRegistro = null, $parNumeroUnidadeRemetente = null, $parNumeroUnidadeDestino = null, $parProtocolo = null, $parNumeroRepositorioEstruturas = null) { + $endpoint = 'tramites'; try { $arrObjTramite = array(); - $parametros = new stdClass(); - $parametros->filtroDeConsultaDeTramites = new stdClass(); - $parametros->filtroDeConsultaDeTramites->IDT = $parNumIdTramite; + $parametros = [ + 'IDT' => $parNumIdTramite + ]; - if(!is_null($parNumeroRegistro)){ - $parametros->filtroDeConsultaDeTramites->NRE = $parNumeroRegistro; - } + if(!is_null($parNumeroRegistro)){ + $parametros['NRE'] = $parNumeroRegistro; + } - if(!is_null($parNumeroUnidadeRemetente) && !is_null($parNumeroRepositorioEstruturas)){ - $parametros->filtroDeConsultaDeTramites->remetente = new stdClass(); - $parametros->filtroDeConsultaDeTramites->remetente->identificacaoDoRepositorioDeEstruturas = $parNumeroRepositorioEstruturas; - $parametros->filtroDeConsultaDeTramites->remetente->numeroDeIdentificacaoDaEstrutura = $parNumeroUnidadeRemetente; - } + if(!is_null($parNumeroUnidadeRemetente) && !is_null($parNumeroRepositorioEstruturas)){ + $parametros['remetente']['identificacaoDoRepositorioDeEstruturas'] = $parNumeroRepositorioEstruturas; + $parametros['remetente']['numeroDeIdentificacaoDaEstrutura'] = $parNumeroUnidadeRemetente; + } - if(!is_null($parNumeroUnidadeDestino) && !is_null($parNumeroRepositorioEstruturas)){ - $parametros->filtroDeConsultaDeTramites->destinatario = new stdClass(); - $parametros->filtroDeConsultaDeTramites->destinatario->identificacaoDoRepositorioDeEstruturas = $parNumeroRepositorioEstruturas; - $parametros->filtroDeConsultaDeTramites->destinatario->numeroDeIdentificacaoDaEstrutura = $parNumeroUnidadeDestino; - } + if(!is_null($parNumeroUnidadeDestino) && !is_null($parNumeroRepositorioEstruturas)){ + $parametros['destinatario']['identificacaoDoRepositorioDeEstruturas'] = $parNumeroRepositorioEstruturas; + $parametros['destinatario']['numeroDeIdentificacaoDaEstrutura'] = $parNumeroUnidadeDestino; + } - if(!is_null($parProtocolo)){ - $parametros->filtroDeConsultaDeTramites->protocolo = $parProtocolo; - } + if (!is_null($parProtocolo)) { + $parametros['protocolo'] = $parProtocolo; + } - $objTramitesEncontrados = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - return $objPenWs->consultarTramites($parametros); - }); + $arrResultado = $this->get($endpoint, $parametros); + + if (isset($arrResultado['tramites']) && !empty($arrResultado['tramites'][0])) { + + $itensHistorico = []; + foreach ($arrResultado['tramites'][0]['mudancasDeSituacao'] as $mudancaDeSituacao) { + $itensHistorico['operacao'][] = $mudancaDeSituacao; + } + + $arrResultado['tramites'][0] = array_filter($arrResultado['tramites'][0], function($value) { + return !is_null($value); + }); + + $arrObjTramite[] = $this->converterArrayParaObjeto($arrResultado['tramites'][0]); + $arrObjTramite[0]->itensHistorico = (object) $itensHistorico; - if(isset($objTramitesEncontrados->tramitesEncontrados) && isset($objTramitesEncontrados->tramitesEncontrados->tramite)) { - $arrObjTramite = $objTramitesEncontrados->tramitesEncontrados->tramite; - if(!is_array($arrObjTramite)) { - $arrObjTramite = array($objTramitesEncontrados->tramitesEncontrados->tramite); } - } return $arrObjTramite; @@ -1620,24 +1761,18 @@ public function consultarTramites($parNumIdTramite = null, $parNumeroRegistro = public function consultarTramitesProtocolo($parProtocoloFormatado) { + $arrObjTramite = array(); try { - $arrObjTramite = array(); - $parametros = new stdClass(); - $parametros->filtroDeConsultaDeTramites = new stdClass(); - $parametros->filtroDeConsultaDeTramites->protocolo = $parProtocoloFormatado; - - $objTramitesEncontrados = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - return $objPenWs->consultarTramites($parametros); - }); + $parametros = [ + 'protocolo' => $parProtocoloFormatado + ]; - if(isset($objTramitesEncontrados->tramitesEncontrados)) { + $arrResultado = $this->consultarTramites(null, null, null, null, $parametros['protocolo']); - $arrObjTramite = $objTramitesEncontrados->tramitesEncontrados->tramite; - if(!is_array($arrObjTramite)) { - $arrObjTramite = array($objTramitesEncontrados->tramitesEncontrados->tramite); + if (isset($arrResultado)) { + $arrObjTramite = $arrResultado; } - } return $arrObjTramite; } catch (\Exception $e) { @@ -1649,14 +1784,16 @@ public function consultarTramitesProtocolo($parProtocoloFormatado) public function cienciaRecusa($parNumIdTramite) { + $endpoint = "tramites/{$parNumIdTramite}/ciencia"; try { - $parametros = new stdClass(); - $parametros->IDT = $parNumIdTramite; - //return $this->getObjPenWs()->cienciaRecusa($parametro); - return $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - return $objPenWs->cienciaRecusa($parametros); - }); + $parametros = [ + 'IDT' => $parNumIdTramite + ]; + + $arrResultado = $this->get($endpoint, $parametros); + return $arrResultado; + } catch (\Exception $e) { $mensagem = "Falha no registro de ciência da recusa de trâmite"; $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); @@ -1664,7 +1801,7 @@ public function cienciaRecusa($parNumIdTramite) } } - /** + /** * Retorna o estado atual do procedimento no api-pen * * @param integer $dblIdProcedimento @@ -1674,61 +1811,50 @@ public function cienciaRecusa($parNumIdTramite) */ public function consultarEstadoProcedimento($strProtocoloFormatado = '', $numIdRepositorio = null, $numIdEstrutura = null) { - $objBD = new GenericoBD($this->inicializarObjInfraIBanco()); + $objBD = new GenericoBD($this->inicializarObjInfraIBanco()); - $objProtocoloDTO = new ProtocoloDTO(); - $objProtocoloDTO->setStrProtocoloFormatado($strProtocoloFormatado); - $objProtocoloDTO->setNumMaxRegistrosRetorno(1); - $objProtocoloDTO->retDblIdProtocolo(); - $objProtocoloDTO->retStrProtocoloFormatado(); - $objProtocoloDTO->retStrStaEstado(); + $objProtocoloDTO = new ProtocoloDTO(); + $objProtocoloDTO->setStrProtocoloFormatado($strProtocoloFormatado); + $objProtocoloDTO->setNumMaxRegistrosRetorno(1); + $objProtocoloDTO->retDblIdProtocolo(); + $objProtocoloDTO->retStrProtocoloFormatado(); + $objProtocoloDTO->retStrStaEstado(); - $objProtocoloDTO = $objBD->consultar($objProtocoloDTO); + $objProtocoloDTO = $objBD->consultar($objProtocoloDTO); if (empty($objProtocoloDTO)) { throw new InfraException(mb_convert_encoding(sprintf('Nenhum procedimento foi encontrado com o id %s', $strProtocoloFormatado), 'UTF-8', 'ISO-8859-1')); } if ($objProtocoloDTO->getStrStaEstado() != ProtocoloRn::$TE_PROCEDIMENTO_BLOQUEADO) { - throw new InfraException(mb_convert_encoding('O processo não esta com o estado com "Em Processamento" ou "Bloqueado"', 'UTF-8', 'ISO-8859-1')); + throw new InfraException(mb_convert_encoding('O processo não esta com o estado com "Em Processamento" ou "Bloqueado"', 'UTF-8', 'ISO-8859-1')); } - $objTramiteDTO = new TramiteDTO(); - $objTramiteDTO->setNumIdProcedimento($objProtocoloDTO->retDblIdProtocolo()); - $objTramiteDTO->setOrd('Registro', InfraDTO::$TIPO_ORDENACAO_DESC); - $objTramiteDTO->setNumMaxRegistrosRetorno(1); - $objTramiteDTO->retNumIdTramite(); + $objTramiteDTO = new TramiteDTO(); + $objTramiteDTO->setNumIdProcedimento($objProtocoloDTO->getDblIdProtocolo()); + $objTramiteDTO->setOrd('Registro', InfraDTO::$TIPO_ORDENACAO_DESC); + $objTramiteDTO->setNumMaxRegistrosRetorno(1); + $objTramiteDTO->retNumIdTramite(); - $objTramiteBD = new TramiteBD($this->getObjInfraIBanco()); - $arrObjTramiteDTO = $objTramiteBD->listar($objTramiteDTO); + $objTramiteBD = new TramiteBD($this->getObjInfraIBanco()); + $arrObjTramiteDTO = $objTramiteBD->listar($objTramiteDTO); if(!$arrObjTramiteDTO){ throw new InfraException('Trâmite não encontrado'); } - $objTramiteDTO = $arrObjTramiteDTO[0]; + $objTramiteDTO = $arrObjTramiteDTO[0]; - $objFiltro = new stdClass(); - $objFiltro->filtroDeConsultaDeTramites = new stdClass(); - $objFiltro->filtroDeConsultaDeTramites->IDT = $objTramiteDTO->getNumIdTramite(); + $arrResultado = $this->consultarTramites($objTramiteDTO->getNumIdTramite()); - $objResultado = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($objFiltro) { - return $objPenWs->consultarTramites($objFiltro); - }); - - $objTramitesEncontrados = $objResultado->tramitesEncontrados; - - if (empty($objTramitesEncontrados) || !isset($objTramitesEncontrados->tramite)) { - throw new InfraException(mb_convert_encoding(sprintf('Nenhum tramite foi encontrado para o procedimento %s', $strProtocoloFormatado), 'UTF-8', 'ISO-8859-1')); + if (empty($arrResultado) || !isset($arrResultado)) { + throw new InfraException(mb_convert_encoding(sprintf('Nenhum tramite foi encontrado para o procedimento %s', $strProtocoloFormatado), 'UTF-8', 'ISO-8859-1')); } - if(!is_array($objTramitesEncontrados->tramite)){ - $objTramitesEncontrados->tramite = array($objTramitesEncontrados->tramite); - } - $arrObjTramite = (array) $objTramitesEncontrados->tramite; + $arrObjTramite = (array) $arrResultado; + $objTramite = array_pop($arrObjTramite); - $objTramite = array_pop($arrObjTramite); if (empty($numIdRepositorio)) { $objPenParametroRN = new PenParametroRN(); @@ -1787,6 +1913,7 @@ public function consultarEstadoProcedimento($strProtocoloFormatado = '', $numIdR public function enviarReciboDeTramite($parNumIdTramite, $parDthRecebimento, $parStrReciboTramite) { + $endpoint = "tramites/{$parNumIdTramite}/recibo"; try { $strHashAssinatura = null; @@ -1799,15 +1926,12 @@ public function enviarReciboDeTramite($parNumIdTramite, $parDthRecebimento, $par openssl_sign($parStrReciboTramite, $strHashAssinatura, $objPrivatekey, 'sha256'); $strHashDaAssinaturaBase64 = base64_encode($strHashAssinatura); - $parametros = new stdClass(); - $parametros->dadosDoReciboDeTramite = new stdClass(); - $parametros->dadosDoReciboDeTramite->IDT = $parNumIdTramite; - $parametros->dadosDoReciboDeTramite->dataDeRecebimento = $parDthRecebimento; - $parametros->dadosDoReciboDeTramite->hashDaAssinatura = $strHashDaAssinaturaBase64; + $envioDeReciboDeTramite = [ + 'dataDeRecebimento' => $parDthRecebimento, + 'hashDaAssinatura' => $strHashDaAssinaturaBase64, + ]; - $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - return $objPenWs->enviarReciboDeTramite($parametros); - }); + $this->post($endpoint, $envioDeReciboDeTramite); return $strHashDaAssinaturaBase64; @@ -1824,12 +1948,16 @@ public function enviarReciboDeTramite($parNumIdTramite, $parDthRecebimento, $par public function receberReciboDeTramite($parNumIdTramite) { - try { - $parametros = new stdClass(); - $parametros->IDT = $parNumIdTramite; - return $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - return $objPenWs->receberReciboDeTramite($parametros); - }); + $endpoint = "tramites/{$parNumIdTramite}/recibo"; + try{ + $parametros = [ + 'IDT' => $parNumIdTramite + ]; + + $arrResultado = $this->get($endpoint, $parametros); + $arrResultado['recibo']['hashDoComponenteDigital'] = $arrResultado['recibo']['hashesDosComponentesDigitais'][0]; + + return $this->converterArrayParaObjeto($arrResultado); } catch (\Exception $e) { $mensagem = "Falha no recebimento de recibo de trâmite. ". $this->tratarFalhaWebService($e); @@ -1846,14 +1974,16 @@ public function receberReciboDeTramite($parNumIdTramite) */ public function receberReciboDeEnvio($parNumIdTramite) { - try { - $parametros = new stdClass(); - $parametros->IDT = $parNumIdTramite; - $resultado = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - return $objPenWs->receberReciboDeEnvio($parametros); - }); + $endpoint = "tramites/{$parNumIdTramite}/recibo-de-envio"; + try{ + $parametros = [ + 'IDT' => $parNumIdTramite + ]; - return $resultado->conteudoDoReciboDeEnvio; + $arrResultado = $this->get($endpoint, $parametros); + $arrResultado['reciboDeEnvio']['hashDoComponenteDigital'] = $arrResultado['reciboDeEnvio']['hashesDosComponentesDigitais'][0]; + + return $this->converterArrayParaObjeto($arrResultado); } catch (\Exception $e) { $mensagem = "Falha no recebimento de recibo de trâmite de envio. " . $this->tratarFalhaWebService($e); @@ -1977,17 +2107,18 @@ public function obterIdTarefaSEIMapeado($strCodigoOperacao) * @throws Exception|InfraException * @return null */ + public function cancelarTramite($idTramite) { - $parametros = new stdClass(); - $parametros->IDT = $idTramite; - + $endpoint = "tramites/{$idTramite}"; try{ - $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - return $objPenWs->cancelarEnvioDeTramite($parametros); - }); - } - catch(\Exception $e) { + $parametros = [ + 'IDT' => $idTramite + ]; + + $this->delete($endpoint, $parametros); + + } catch(\Exception $e) { $mensagem = "Falha no cancelamento de trâmite de processo"; $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); throw new InfraException($mensagem, $e, $detalhes); @@ -2006,16 +2137,15 @@ public function cancelarTramite($idTramite) public function recusarTramite($idTramite, $justificativa, $motivo) { try { + $endpoint = "tramites/{$idTramite}/recusa"; $objProcessoEletronicoRN = new ProcessoEletronicoRN(); - $parametros = new stdClass(); - $parametros->recusaDeTramite = new stdClass(); - $parametros->recusaDeTramite->IDT = $idTramite; - $parametros->recusaDeTramite->justificativa = mb_convert_encoding($objProcessoEletronicoRN->reduzirCampoTexto($justificativa, 1000), 'UTF-8', 'ISO-8859-1'); - $parametros->recusaDeTramite->motivo = $motivo; + + $parametros = [ + 'justificativa' => utf8_encode($objProcessoEletronicoRN->reduzirCampoTexto($justificativa, 1000)), + 'motivo' => $motivo + ]; - $resultado = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - return $objPenWs->recusarTramite($parametros); - }); + $this->post($endpoint, $parametros); } catch (Exception $e) { $mensagem = "Falha na recusa de trâmite de processo"; @@ -2040,53 +2170,53 @@ public function cadastrarTramitePendente($numIdentificacaoTramite, $idAtividadeE } public function isDisponivelCancelarTramite($strProtocolo = '') - { - //Obtem o id_rh que representa a unidade no barramento - $objPenParametroRN = new PenParametroRN(); - $numIdRespositorio = $objPenParametroRN->getParametro('PEN_ID_REPOSITORIO_ORIGEM'); + { + //Obtem o id_rh que representa a unidade no barramento + $objPenParametroRN = new PenParametroRN(); + $numIdRespositorio = $objPenParametroRN->getParametro('PEN_ID_REPOSITORIO_ORIGEM'); - //Obtem os dados da unidade - $objPenUnidadeDTO = new PenUnidadeDTO(); - $objPenUnidadeDTO->setNumIdUnidade(SessaoSEI::getInstance()->getNumIdUnidadeAtual()); - $objPenUnidadeDTO->retNumIdUnidadeRH(); + //Obtem os dados da unidade + $objPenUnidadeDTO = new PenUnidadeDTO(); + $objPenUnidadeDTO->setNumIdUnidade(SessaoSEI::getInstance()->getNumIdUnidadeAtual()); + $objPenUnidadeDTO->retNumIdUnidadeRH(); - $objGenericoBD = new GenericoBD($this->inicializarObjInfraIBanco()); - $objPenUnidadeDTO = $objGenericoBD->consultar($objPenUnidadeDTO); + $objGenericoBD = new GenericoBD($this->inicializarObjInfraIBanco()); + $objPenUnidadeDTO = $objGenericoBD->consultar($objPenUnidadeDTO); - //Obtem os dados do último trâmite desse processo no barramento - $objProtocoloDTO = new ProtocoloDTO(); - $objProtocoloDTO->setStrProtocoloFormatado($strProtocolo); - $objProtocoloDTO->retDblIdProtocolo(); + //Obtem os dados do último trâmite desse processo no barramento + $objProtocoloDTO = new ProtocoloDTO(); + $objProtocoloDTO->setStrProtocoloFormatado($strProtocolo); + $objProtocoloDTO->retDblIdProtocolo(); - $objProtocoloRN = new ProtocoloRN(); - $objProtocoloDTO = $objProtocoloRN->consultarRN0186($objProtocoloDTO); + $objProtocoloRN = new ProtocoloRN(); + $objProtocoloDTO = $objProtocoloRN->consultarRN0186($objProtocoloDTO); - $objTramiteDTO = new TramiteDTO(); - $objTramiteDTO->setNumIdProcedimento($objProtocoloDTO->retDblIdProtocolo()); - $objTramiteDTO->setOrd('Registro', InfraDTO::$TIPO_ORDENACAO_DESC); - $objTramiteDTO->setNumMaxRegistrosRetorno(1); - $objTramiteDTO->retNumIdTramite(); + $objTramiteDTO = new TramiteDTO(); + $objTramiteDTO->setNumIdProcedimento($objProtocoloDTO->retDblIdProtocolo()); + $objTramiteDTO->setOrd('Registro', InfraDTO::$TIPO_ORDENACAO_DESC); + $objTramiteDTO->setNumMaxRegistrosRetorno(1); + $objTramiteDTO->retNumIdTramite(); - $objTramiteBD = new TramiteBD($this->getObjInfraIBanco()); - $arrObjTramiteDTO = $objTramiteBD->listar($objTramiteDTO); + $objTramiteBD = new TramiteBD($this->getObjInfraIBanco()); + $arrObjTramiteDTO = $objTramiteBD->listar($objTramiteDTO); if(!$arrObjTramiteDTO){ - return false; + return false; } - $objTramiteDTO = $arrObjTramiteDTO[0]; + $objTramiteDTO = $arrObjTramiteDTO[0]; try { - $parametros = new stdClass(); - $parametros->filtroDeConsultaDeTramites = new stdClass(); - $parametros->filtroDeConsultaDeTramites->IDT = $objTramiteDTO->getNumIdTramite(); - $parametros->filtroDeConsultaDeTramites->remetente = new stdClass(); - $parametros->filtroDeConsultaDeTramites->remetente->identificacaoDoRepositorioDeEstruturas = $numIdRespositorio; - $parametros->filtroDeConsultaDeTramites->remetente->numeroDeIdentificacaoDaEstrutura = $objPenUnidadeDTO->getNumIdUnidadeRH(); - - $objMeta = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - return $objPenWs->consultarTramites($parametros); - }); + $parametros = new stdClass(); + $parametros->filtroDeConsultaDeTramites = new stdClass(); + $parametros->filtroDeConsultaDeTramites->IDT = $objTramiteDTO->getNumIdTramite(); + $parametros->filtroDeConsultaDeTramites->remetente = new stdClass(); + $parametros->filtroDeConsultaDeTramites->remetente->identificacaoDoRepositorioDeEstruturas = $numIdRespositorio; + $parametros->filtroDeConsultaDeTramites->remetente->numeroDeIdentificacaoDaEstrutura = $objPenUnidadeDTO->getNumIdUnidadeRH(); + + $objMeta = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { + return $objPenWs->consultarTramites($parametros); + }); if($objMeta->tramitesEncontrados) { $arrObjMetaTramite = !is_array($objMeta->tramitesEncontrados->tramite) ? array($objMeta->tramitesEncontrados->tramite) : $objMeta->tramitesEncontrados->tramite; @@ -2098,40 +2228,43 @@ public function isDisponivelCancelarTramite($strProtocolo = '') ); if(in_array($objMetaTramite->situacaoAtual, $strSituacoesDisponíveisCancelamento)){ - return true; + return true; } } - return false; + return false; } catch(SoapFault $e) { - return false; + return false; } catch(Exception $e) { - return false; + return false; } } - public function consultarHipotesesLegais($ativos = true) { - try{ - $parametros = new stdClass(); - $parametros->filtroDeHipotesesLegais = new stdClass(); - $parametros->filtroDeHipotesesLegais->ativos = $ativos; + public function consultarHipotesesLegais($ativos = true) + { + $endpoint = "hipoteses"; - $hipoteses = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - return $objPenWs->consultarHipotesesLegais($parametros); - }); + $parametros = [ + 'ativos' => $ativos + ]; - if (empty($hipoteses)) { - return []; - } - return $hipoteses; + try { + $arrResultado = $this->get($endpoint, $parametros); + return $arrResultado; - } catch(Exception $e){ - $mensagem = "Falha na obtenção de hipóteses legais"; - $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); - throw new InfraException($mensagem, $e, $detalhes); - } + if (empty($hipoteses)) { + return []; + } + + return $hipoteses; + + } catch(Exception $e){ + $mensagem = "Falha na obtenção de hipóteses legais"; + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + throw new InfraException($mensagem, $e, $detalhes); + } } protected function contarConectado(ProcessoEletronicoDTO $objProcessoEletronicoDTO) @@ -2197,17 +2330,21 @@ public static function comparacaoOrdemComponenteDigitais($parComponenteDigital1, public static function obterDocumentosProtocolo($parObjProtocolo, $parBolExtrairAnexados = false) { $arrObjDocumento = array(); - if(isset($parObjProtocolo->documento)){ - $arrObjProtocolo = is_array($parObjProtocolo->documento) ? $parObjProtocolo->documento : array($parObjProtocolo->documento); + if(isset($parObjProtocolo->documentos)){ + $arrObjProtocolo = is_array($parObjProtocolo->documentos) ? $parObjProtocolo->documentos : array($parObjProtocolo->documentos); usort($arrObjProtocolo, array("ProcessoEletronicoRN", "comparacaoOrdemAjustadaDocumentos")); //Tratamento recursivo para processos anexados foreach ($arrObjProtocolo as $objProtocolo) { + if (is_array(($objProtocolo))) { + $objProtocolo = (object) $objProtocolo; + } $bolEhProcessoAnexado = $objProtocolo->staTipoProtocolo == ProcessoEletronicoRN::$STA_TIPO_PROTOCOLO_PROCESSO; if($parBolExtrairAnexados && $bolEhProcessoAnexado){ $arrProtocolosAnexados = ProcessoEletronicoRN::obterDocumentosProtocolo($objProtocolo, $parBolExtrairAnexados); $arrObjDocumento = array_merge($arrObjDocumento, $arrProtocolosAnexados); } else { + if(!$bolEhProcessoAnexado){ $objProtocolo->idProcedimentoSEI = $parObjProtocolo->idProcedimentoSEI; } @@ -2220,7 +2357,7 @@ public static function obterDocumentosProtocolo($parObjProtocolo, $parBolExtrair //Quando se tratar de um Documento Avulso, a ordem será sempre 1 $parObjProtocolo->ordem = 1; $parObjProtocolo->ordemAjustada = 1; - $parObjProtocolo->componenteDigital = self::obterComponentesDocumentos($parObjProtocolo); + $parObjProtocolo->componentesDigitais = self::obterComponentesDocumentos($parObjProtocolo); return array($parObjProtocolo); } @@ -2230,9 +2367,12 @@ public static function obterDocumentosProtocolo($parObjProtocolo, $parBolExtrair $arrObjDocumentoPadronizados = ($parBolExtrairAnexados) ? $arrObjDocumento : $arrObjProtocolo; - foreach ($arrObjDocumentoPadronizados as $objDocumento) { - $objDocumento->componenteDigital = self::obterComponentesDocumentos($objDocumento); - } + foreach ($arrObjDocumentoPadronizados as $documento) { + if (is_array($documento) && $documento['componentesDigitais']) { + $documento = (object) $documento; + } + $documento->componentesDigitais = self::obterComponentesDocumentos($documento); + } return $arrObjDocumentoPadronizados; } @@ -2240,17 +2380,15 @@ public static function obterDocumentosProtocolo($parObjProtocolo, $parBolExtrair public static function obterComponentesDocumentos($parObjDocumento) { - $arrObjComponenteDigital=array(); - if(isset($parObjDocumento->componenteDigital)){ - - $arrObjComponenteDigital = is_array($parObjDocumento->componenteDigital) ? $parObjDocumento->componenteDigital : array($parObjDocumento->componenteDigital); - usort($arrObjComponenteDigital, array("ProcessoEletronicoRN", "comparacaoOrdemComponenteDigitais")); - } - - - return $arrObjComponenteDigital; - - } + + $arrObjComponenteDigital = array(); + if (isset($parObjDocumento->componentesDigitais)) { + $arrObjComponenteDigital = is_array($parObjDocumento->componentesDigitais) ? $parObjDocumento->componentesDigitais : array($parObjDocumento->componentesDigitais); + usort($arrObjComponenteDigital, array("ProcessoEletronicoRN", "comparacaoOrdemComponenteDigitais")); + } + + return $arrObjComponenteDigital; + } /** * Retorna a referência para o processo ou documento avulso @@ -2302,11 +2440,11 @@ public static function obterUnidadeParaRegistroDocumento($parDblIdProcedimento) * @param $parObjDocumento * @return array */ - public static function obterComponentesDigitaisDocumento($parObjDocumento) + public static function obterComponentesDigitaisDocumento($parObjDocumento) { $arrObjComponenteDigital = array(); - if(isset($parObjDocumento->componenteDigital)){ - $arrObjComponenteDigital = is_array($parObjDocumento->componenteDigital) ? $parObjDocumento->componenteDigital : array($parObjDocumento->componenteDigital); + if(isset($parObjDocumento->componentesDigitais)){ + $arrObjComponenteDigital = is_array($parObjDocumento->componentesDigitais) ? $parObjDocumento->componentesDigitais : array($parObjDocumento->componentesDigitais); } return $arrObjComponenteDigital; @@ -2326,17 +2464,18 @@ public static function obterComponentesDigitaisDocumento($parObjDocumento) */ public static function desmembrarProcessosAnexados($parObjProtocolo) { + if(!ProcessoEletronicoRN::existeProcessoAnexado($parObjProtocolo)){ - return $parObjProtocolo; + return $parObjProtocolo; } - $arrObjRefProcessosAnexados = array(); - $objProcessoPrincipal = clone $parObjProtocolo; - $objProcessoPrincipal->documento = array(); - $arrObjDocumentosOrdenados = ProcessoEletronicoRN::obterDocumentosProtocolo($parObjProtocolo, true); - usort($arrObjDocumentosOrdenados, array("ProcessoEletronicoRN", "comparacaoOrdemDocumentos")); + $arrObjRefProcessosAnexados = array(); + $objProcessoPrincipal = clone $parObjProtocolo; + $objProcessoPrincipal->documentos = array(); + $arrObjDocumentosOrdenados = ProcessoEletronicoRN::obterDocumentosProtocolo($parObjProtocolo, true); + usort($arrObjDocumentosOrdenados, array("ProcessoEletronicoRN", "comparacaoOrdemDocumentos")); - // Agrupamento dos documentos por processo + // Agrupamento dos documentos por processo foreach ($arrObjDocumentosOrdenados as $objDocumento) { $bolDocumentoAnexado = ProcessoEletronicoRN::documentoFoiAnexado($parObjProtocolo, $objDocumento); $strProtocoloProcAnexado = ($bolDocumentoAnexado) ? $objDocumento->protocoloDoProcessoAnexado : $objProcessoPrincipal->protocolo; @@ -2346,20 +2485,20 @@ public static function desmembrarProcessosAnexados($parObjProtocolo) // existe apenas o número do protocolo de referência if($bolDocumentoAnexado && !array_key_exists($strProtocoloProcAnexado, $arrObjRefProcessosAnexados)){ $objProcessoAnexado = clone $objProcessoPrincipal; - $objProcessoAnexado->documento = array(); + $objProcessoAnexado->documentos = array(); $objProcessoAnexado->protocolo = $strProtocoloProcAnexado; - $objProcessoAnexado->ordemAjustada = count($objProcessoPrincipal->documento) + 1; - $objProcessoPrincipal->documento[] = $objProcessoAnexado; + $objProcessoAnexado->ordemAjustada = count($objProcessoPrincipal->documentos) + 1; + $objProcessoPrincipal->documentos[] = $objProcessoAnexado; $arrObjRefProcessosAnexados[$strProtocoloProcAnexado] = $objProcessoAnexado; } $objProcessoDoDocumento = ($bolDocumentoAnexado) ? $arrObjRefProcessosAnexados[$strProtocoloProcAnexado] : $objProcessoPrincipal; $objDocumentoReposicionado = clone $objDocumento; - $objDocumentoReposicionado->ordemAjustada = count($objProcessoDoDocumento->documento) + 1; - $objProcessoDoDocumento->documento[] = $objDocumentoReposicionado; + $objDocumentoReposicionado->ordemAjustada = count($objProcessoDoDocumento->documentos) + 1; + $objProcessoDoDocumento->documentos[] = $objDocumentoReposicionado; } - return $objProcessoPrincipal; + return $objProcessoPrincipal; } /** @@ -2417,10 +2556,10 @@ public static function obterTamanhoBlocoTransferencia(){ private static function documentoFoiAnexado($parObjProtocolo, $parObjDocumento) { return ( - isset($parObjDocumento->protocoloDoProcessoAnexado) && - !empty($parObjDocumento->protocoloDoProcessoAnexado) && - $parObjProtocolo->protocolo != $parObjDocumento->protocoloDoProcessoAnexado - ); + isset($parObjDocumento->protocoloDoProcessoAnexado) && + !empty($parObjDocumento->protocoloDoProcessoAnexado) && + $parObjProtocolo->protocolo != $parObjDocumento->protocoloDoProcessoAnexado + ); } /** @@ -2590,4 +2729,121 @@ public function listarAssociacoesDocumentos($idProcedimento) } return $arrIdDocumentos; } -} + + /** + * Converter arrays associativo para objetos + */ + public static function converterArrayParaObjeto($array) + { + if (is_array($array)) { + // Verificar se o array é associativo + if (self::verificarSeArrayAssociativo($array)) { + $object = new stdClass(); + foreach ($array as $key => $value) { + $object->$key = self::converterArrayParaObjeto($value); + } + return $object; + } else { + // Para arrays indexados, manter como está + return array_map([self::class, 'converterArrayParaObjeto'], $array); + } + } + + return $array; + } + + private static function verificarSeArrayAssociativo(array $array): bool + { + return array_keys($array) !== range(0, count($array) - 1); + } + + + /** + * Consulta as estruturas de um repositório de estruturas. + * + * @param int $idRepositorioEstrutura O ID do repositório de estruturas. + * @param array $parametros Parâmetros adicionais para a consulta. + * @throws InfraException Falha na obtenção de unidades externas. + * @return array + */ + public function consultarEstruturas($idRepositorioEstrutura, $parametros = []) + { + $endpoint = "repositorios-de-estruturas/{$idRepositorioEstrutura}/estruturas-organizacionais"; + try { + $arrResultado = $this->get($endpoint, $parametros); + return $arrResultado; + } catch (Exception $e) { + $mensagem = "Falha na obtenção de unidades externas"; + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + throw new InfraException($mensagem, $e, $detalhes); + } + } + + /** + * Consulta as estruturas de um repositório de estruturas. + * + * @param int $idRepositorioEstrutura O ID do repositório de estruturas. + * @param array $parametros Parâmetros adicionais para a consulta. + * @throws InfraException Falha na obtenção de unidades externas. + * @return array + */ + public function buscarEstruturaRest($idRepositorioEstrutura, $idUnidadeRH) + { + $endpoint = "repositorios-de-estruturas/{$idRepositorioEstrutura}/estruturas-organizacionais/{$idUnidadeRH}"; + try { + $arrResultado = $this->get($endpoint); + return $arrResultado; + } catch (Exception $e) { + $mensagem = "Falha na obtenção de unidades externas"; + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + LogSEI::getInstance()->gravar($detalhes, InfraLog::$ERRO); + throw new InfraException($mensagem, $e, $mensagem); + } + } + + /** + * Iniciar requisição HTTP utilizado para comunicação Webservice REST + * + */ + private function getArrPenWsRest($method, $endpoint, $options = []) + { + try { + $arrResultado = $this->strClientGuzzle->request($method, $endpoint, $options); + $base64 = $arrResultado->getBody()->getContents(); + + $foo = json_decode($arrResultado->getBody(), true); + if ($foo != null) { + return $foo; + } + + return $base64; + } catch (RequestException $e) { + $erroResposta = json_decode($e->getResponse()->getBody()->getContents()); + + // Lança uma nova exceção com os detalhes do RequestException + throw new Exception(json_encode([ + 'error' => true, + 'codigoErro' => $erroResposta->codigoErro, + 'message' => $erroResposta->mensagem, + 'exception' => $e->getMessage(), + 'details' => $e->hasResponse() ? (string) $e->getResponse()->getBody() : 'No response body' + ])); + } + } + + public function get($endpoint, $params = []) { + return $this->getArrPenWsRest('GET', $endpoint, ['query' => $params]); + } + + public function post($endpoint, $data = []) { + return $this->getArrPenWsRest('POST', $endpoint, ['json' => $data]); + } + + public function put($endpoint, $data = []) { + return $this->getArrPenWsRest('PUT', $endpoint, ['json' => $data]); + } + + public function delete($endpoint, $params = []) { + return $this->getArrPenWsRest('DELETE', $endpoint, ['query' => $params]); + } +} \ No newline at end of file diff --git a/src/rn/ReceberComponenteDigitalRN.php b/src/rn/ReceberComponenteDigitalRN.php index def90b2c0..82077f3e2 100755 --- a/src/rn/ReceberComponenteDigitalRN.php +++ b/src/rn/ReceberComponenteDigitalRN.php @@ -150,7 +150,7 @@ protected function compactarAnexosDoDocumento($parNumIdDocumento, $parArrAnexoDT $contDocumentosDto = 0; $arrayRetornoObjAnexoDTO = array(); - foreach ($arrObjDocumentoDTO as $objDocumentoDTO){ + foreach ($arrObjDocumentoDTO as $objDocumentoDTO) { $contDocumentosDto++; $objAnexoRN = new AnexoRN(); @@ -173,7 +173,7 @@ protected function compactarAnexosDoDocumento($parNumIdDocumento, $parArrAnexoDT $numSequencial++; if ($objAnexoDTO==null){ - $objInfraException->adicionarValidacao('Documento '.$objDocumentoDTO->getStrProtocoloDocumentoFormatado() .' não encontrado.'); + $objInfraException->adicionarValidacao('Documento '.$objDocumentoDTO->getStrProtocoloDocumentoFormatado() .' não encontrado.'); }else{ /** * Aqui será atribuído um nome aos anexos @@ -191,14 +191,14 @@ protected function compactarAnexosDoDocumento($parNumIdDocumento, $parArrAnexoDT $strLocalizacaoArquivo = DIR_SEI_TEMP.'/'. $objAnexoDTO->getNumIdAnexo() ; //if ($zipFile->addFile($strLocalizacaoArquivo,'['.$numComponenteDigital.']-'.InfraUtil::formatarNomeArquivo($strNomeArquivo)) === false){ if ($zipFile->addFile($strLocalizacaoArquivo, '['.$numSequencial.']-'.InfraUtil::formatarNomeArquivo($strNomeArquivo)) === false){ - throw new InfraException('Erro adicionando arquivo externo ao zip.'); + throw new InfraException('Erro adicionando arquivo externo ao zip.'); } else{ - /** - * Aqui quer dizer que o arquivo já foi colocado dentro do zip. - * Vamos colocá-lo em um array e depois utilizarmos este array para fazer as exclusões. - */ - array_push($arrayAnexosExcluirFisicamente, $strLocalizacaoArquivo); + /** + * Aqui quer dizer que o arquivo já foi colocado dentro do zip. + * Vamos colocá-lo em um array e depois utilizarmos este array para fazer as exclusões. + */ + array_push($arrayAnexosExcluirFisicamente, $strLocalizacaoArquivo); } } } @@ -208,7 +208,7 @@ protected function compactarAnexosDoDocumento($parNumIdDocumento, $parArrAnexoDT } $objInfraException->lancarValidacoes(); if ($zipFile->close() === false) { - throw new InfraException('Não foi possível fechar arquivo zip.'); + throw new InfraException('Não foi possível fechar arquivo zip.'); } $objAnexoDTO = new AnexoDTO(); $arrNomeArquivo = explode('/', $strCaminhoCompletoArquivoZip); @@ -222,7 +222,7 @@ protected function compactarAnexosDoDocumento($parNumIdDocumento, $parArrAnexoDT * Vamos varrer os arquivos que devem ser excluídos fisicamente da pasta temporária e excluí-los */ foreach ($arrayAnexosExcluirFisicamente as $caminhoArquivoExcluirFisicamente){ - unlink($caminhoArquivoExcluirFisicamente); + unlink($caminhoArquivoExcluirFisicamente); } } return $objAnexoDTO; @@ -243,6 +243,7 @@ private function atualizarAnexoDoComponenteDigital($parObjComponenteDigitalDTO, $objComponenteDigitalDTO->setStrNumeroRegistro($parObjComponenteDigitalDTO->getStrNumeroRegistro()); $objComponenteDigitalDTO->setDblIdDocumento($parObjComponenteDigitalDTO->getDblIdDocumento()); $objComponenteDigitalDTO->setDblIdProcedimento($parObjComponenteDigitalDTO->getDblIdProcedimento()); + //$objComponenteDigitalDTO->setNumOrdem($parObjComponenteDigitalDTO->getNumOrdem()); $objComponenteDigitalDTO->setNumIdAnexo($parObjAnexoDTO->getNumIdAnexo()); $objComponenteDigitalBD = new ComponenteDigitalBD($this->getObjInfraIBanco()); $objComponenteDigitalDTO = $objComponenteDigitalBD->alterar($objComponenteDigitalDTO); @@ -254,10 +255,14 @@ private function atualizarAnexoDoComponenteDigital($parObjComponenteDigitalDTO, * */ public function copiarComponenteDigitalPastaTemporaria($parObjComponenteDigital, $parObjConteudo) - { - if(!isset($parObjComponenteDigital)){ + { + if (!isset($parObjComponenteDigital)) { throw new InfraException("Componente Digital não informado"); } + + if (is_array($parObjComponenteDigital)) { + $parObjComponenteDigital = (object) $parObjComponenteDigital; + } $objAnexoRN = new AnexoRN(); $strNomeArquivoUpload = $objAnexoRN->gerarNomeArquivoTemporario(); $strConteudoCodificado = $parObjConteudo->conteudoDoComponenteDigital; @@ -277,7 +282,7 @@ public function copiarComponenteDigitalPastaTemporaria($parObjComponenteDigital, } public function validarIntegridadeDoComponenteDigital(AnexoDTO $objAnexoDTO, $strHashConteudo, $parNumIdentificacaoTramite, $parNumOrdemComponente) - { + { $strHashInformado = $strHashConteudo; $strHashInformado = base64_decode($strHashInformado); @@ -373,4 +378,4 @@ public function cadastrarAnexoDoDocumento(AnexoDTO $parObjAnexoDTO) $objDocumentoRN->alterarRN0004($objDocumentoDTO); } -} +} \ No newline at end of file diff --git a/src/rn/ReceberProcedimentoRN.php b/src/rn/ReceberProcedimentoRN.php index effb562f4..74a3d57ad 100755 --- a/src/rn/ReceberProcedimentoRN.php +++ b/src/rn/ReceberProcedimentoRN.php @@ -21,6 +21,7 @@ class ReceberProcedimentoRN extends InfraRN private $objSeiRN; private $objEnviarReciboTramiteRN; private $objExpedirProcedimentoRN; + private $objReceberComponenteDigitalRN; public function __construct() { @@ -245,7 +246,7 @@ private function baixarComponentesDigitais($parObjTramite, $parObjMetadadosProce // pendentes de recebimento informado pelo Tramita.gov.br não está de acordo com a lista atual de arquivos // mantida pela aplicação. $arrHashComponentesProtocolo = $this->listarHashDosComponentesMetadado($objProtocolo); - $arrHashPendentesRecebimento = $parObjTramite->componenteDigitalPendenteDeRecebimento; + $arrHashPendentesRecebimento = $parObjTramite->hashDosComponentesPendentesDeRecebimento; $numQtdComponentes = count($arrHashComponentesProtocolo); $this->gravarLogDebug("$numQtdComponentes componentes digitais identificados no protocolo {$objProtocolo->protocolo}", 2); @@ -334,8 +335,10 @@ private function consultarTramite($parNumIdTramite) $objTramite = $arrObjTramite[0]; - if(!is_array($objTramite->componenteDigitalPendenteDeRecebimento)){ - $objTramite->componenteDigitalPendenteDeRecebimento = array($objTramite->componenteDigitalPendenteDeRecebimento); + if(!is_array($objTramite->hashDosComponentesPendentesDeRecebimento)){ + $objTramite->componenteDigitalPendenteDeRecebimento = (array) $objTramite->hashDosComponentesPendentesDeRecebimento; + + $objTramite->hashDosComponentesPendentesDeRecebimento = (array) $objTramite->hashDosComponentesPendentesDeRecebimento; } } @@ -646,12 +649,17 @@ private function listarHashDosComponentesMetadado($parObjProtocolo) foreach($arrObjDocumento as $objDocumento){ //Desconsidera os componendes digitais de documentos cancelados if(!isset($objDocumento->retirado) || $objDocumento->retirado == false) { - if(!isset($objDocumento->componenteDigital)){ + if(!isset($objDocumento->componentesDigitais)){ throw new InfraException("Metadados do componente digital do documento de ordem {$objDocumento->ordem} não informado."); } - $arrObjComponentesDigitais = is_array($objDocumento->componenteDigital) ? $objDocumento->componenteDigital : array($objDocumento->componenteDigital); + $arrObjComponentesDigitais = is_array($objDocumento->componentesDigitais) ? $objDocumento->componentesDigitais : array($objDocumento->componentesDigitais); foreach ($arrObjComponentesDigitais as $objComponenteDigital) { + + if (is_array($objComponenteDigital)) { + $objComponenteDigital = (object) $objComponenteDigital; + } + $arrHashsComponentesDigitais[] = ProcessoEletronicoRN::getHashFromMetaDados($objComponenteDigital->hash); } } @@ -672,8 +680,11 @@ private function listarMetaDadosComponentesDigitais($parObjProtocolo) $objMapBD = new GenericoBD($this->getObjInfraIBanco()); $arrObjDocumento = ProcessoEletronicoRN::obterDocumentosProtocolo($parObjProtocolo, true); - foreach($arrObjDocumento as $objDocumento){ - $strHash = ProcessoEletronicoRN::getHashFromMetaDados($objDocumento->componenteDigital->hash); + foreach($arrObjDocumento as $key => $objDocumento){ + if (is_array($objDocumento->componentesDigitais[$key])) { + $objDocumento->componentesDigitais[$key] = (object) $objDocumento->componentesDigitais[$key]; + } + $strHash = ProcessoEletronicoRN::getHashFromMetaDados($objDocumento->componentesDigitais[$key]->hash); $objMapDTO = new PenRelTipoDocMapRecebidoDTO(true); $objMapDTO->setNumMaxRegistrosRetorno(1); $objMapDTO->setNumCodigoEspecie($objDocumento->especie->codigo); @@ -718,16 +729,21 @@ private function validarComponentesDigitais($parObjProtocolo, $parNumIdentificac if(!isset($numIdTipoDocumentoPadrao)){ foreach($arrObjDocumentos as $objDocument){ + $especie = $objDocument->especie; + if (is_array($especie)) { + $objDocument->especie = (object) $objDocument->especie; + } + $objPenRelTipoDocMapEnviadoDTO = new PenRelTipoDocMapRecebidoDTO(); $objPenRelTipoDocMapEnviadoDTO->retTodos(); $objPenRelTipoDocMapEnviadoDTO->setNumCodigoEspecie($objDocument->especie->codigo); - $objProcessoEletronicoDB = new PenRelTipoDocMapRecebidoBD($this->getObjInfraIBanco()); + $objProcessoEletronicoDB = new PenRelTipoDocMapRecebidoBD(BancoSEI::getInstance()); $numContador = (int)$objProcessoEletronicoDB->contar($objPenRelTipoDocMapEnviadoDTO); // Não achou, ou seja, não esta cadastrado na tabela, então não é aceito nesta unidade como válido if($numContador <= 0) { - $this->objProcessoEletronicoRN->recusarTramite($parNumIdentificacaoTramite, sprintf('O Documento do tipo %s não está mapeado para recebimento no sistema de destino. OBS: A recusa é uma das três formas de conclusão de trâmite. Portanto, não é um erro.', mb_convert_encoding($objDocument->especie->nomeNoProdutor, 'ISO-8859-1', 'UTF-8')), ProcessoEletronicoRN::MTV_RCSR_TRAM_CD_ESPECIE_NAO_MAPEADA); + $this->objProcessoEletronicoRN->recusarTramite($parNumIdentificacaoTramite, sprintf('O Documento do tipo %s não está mapeado para recebimento no sistema de destino. OBS: A recusa é uma das três formas de conclusão de trâmite. Portanto, não é um erro.', utf8_decode($objDocument->especie->nomeNoProdutor)), ProcessoEletronicoRN::MTV_RCSR_TRAM_CD_ESPECIE_NAO_MAPEADA); throw new InfraException(sprintf('Documento do tipo %s não está mapeado. Motivo da Recusa no Barramento: %s', $objDocument->especie->nomeNoProdutor, ProcessoEletronicoRN::$MOTIVOS_RECUSA[ProcessoEletronicoRN::MTV_RCSR_TRAM_CD_ESPECIE_NAO_MAPEADA])); } } @@ -736,7 +752,7 @@ private function validarComponentesDigitais($parObjProtocolo, $parNumIdentificac //Não valida informações do componente digital caso o documento esteja cancelado foreach ($arrObjDocumentos as $objDocumento) { if (!isset($objDocumento->retirado) || $objDocumento->retirado === false) { - foreach ($objDocumento->componenteDigital as $objComponenteDigital) { + foreach ($objDocumento->componentesDigitais as $objComponenteDigital) { $this->validaTamanhoComponenteDigital($objComponenteDigital); } } @@ -745,6 +761,10 @@ private function validarComponentesDigitais($parObjProtocolo, $parNumIdentificac private function validaTamanhoComponenteDigital($objComponenteDigital) { + if (is_array($objComponenteDigital)) { + $objComponenteDigital = (object) $objComponenteDigital; + } + 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); } @@ -945,11 +965,11 @@ private function atualizarProcedimento($parDblIdProcedimento, $objMetadadosProce } catch (Exception $e){ $this->gravarLogDebug("Processo $parDblIdProcedimento não pode ser desbloqueado", 2); } - + $numUnidadeReceptora = ModPenUtilsRN::obterUnidadeRecebimento(); $this->enviarProcedimentoUnidade($objProcedimentoDTO, $numUnidadeReceptora); - } finally { + } finally { $numUnidadeReceptora = ModPenUtilsRN::obterUnidadeRecebimento(); SessaoSEI::getInstance()->setNumIdUnidadeAtual($numUnidadeReceptora); } @@ -1054,7 +1074,7 @@ private function gerarProcedimento($objMetadadosProcedimento, $parObjProtocolo) $objProtocoloDTO->setArrObjAnexoDTO(array()); $objProtocoloDTO->setArrObjRelProtocoloAssuntoDTO(array()); $objProtocoloDTO->setArrObjRelProtocoloProtocoloDTO(array()); - $this->atribuirParticipantes($objProtocoloDTO, $parObjProtocolo->interessado); + $this->atribuirParticipantes($objProtocoloDTO, $parObjProtocolo->interessados); $strDescricao = ""; if(isset($parObjProtocolo->processoDeNegocio)){ @@ -1381,7 +1401,7 @@ private function atribuirParticipantes(ProtocoloDTO $objProtocoloDTO, $arrObjInt } if (!is_array($arrObjInteressados)) { - $arrObjInteressados = array($arrObjInteressados); + $arrObjInteressados = (array) $arrObjInteressados; } for($i=0; $i < count($arrObjInteressados); $i++){ @@ -1665,7 +1685,12 @@ private function atribuirDocumentos($parObjProcedimentoDTO, $parObjProtocolo, $o $count = count($arrObjDocumentos); $this->gravarLogDebug("Quantidade de documentos para recebimento: $count", 2); - foreach($arrObjDocumentos as $objDocumento){ + foreach($arrObjDocumentos as $objDocumento) { + + if (is_array($objDocumento)) { + $objDocumento = (object) $objDocumento; + } + if(!isset($objDocumento->staTipoProtocolo) || $bolDocumentoAvulso) { // Definição da ordem do documento para avaliação do posicionamento @@ -1840,7 +1865,7 @@ private function atribuirDocumentos($parObjProcedimentoDTO, $parObjProtocolo, $o //TODO: Fazer a atribuição dos componentes digitais do processo a partir desse ponto $this->atribuirComponentesDigitais( $objDocumentoDTO, - $objDocumento->componenteDigital, + $objDocumento->componentesDigitais, $arrDocumentosExistentesPorHash, $parObjMetadadosProcedimento->arrHashComponenteBaixados); @@ -1916,6 +1941,10 @@ private function atribuirComponentesJaExistentesNoProcesso($objDocumentoDTO, $ob $arrObjAnexosDTO = array(); $arrObjAnexoDTO = array(); foreach ($objComponentesDigitais as $objComponenteDigital) { + if (is_array($objComponenteDigital)) { + $objComponenteDigital = (object) $objComponenteDigital; + } + $strHashComponenteDigital = ProcessoEletronicoRN::getHashFromMetaDados($objComponenteDigital->hash); $bolComponenteDigitalBaixado = in_array($strHashComponenteDigital, $arrHashComponenteBaixados); $bolComponenteDigitalExistente = array_key_exists($strHashComponenteDigital, $arrDocumentosExistentesPorHash); @@ -2518,13 +2547,14 @@ public function validarExtensaoComponentesDigitais($parIdTramite, $parObjProtoco $arquivoExtensaoBD = new ArquivoExtensaoBD($this->getObjInfraIBanco()); foreach($arrDocumentos as $objDocumento){ - if(!isset($objDocumento->retirado) || $objDocumento->retirado == false){ - $arrComponentesDigitais = $objDocumento->componenteDigital; - if(isset($arrComponentesDigitais) && !is_array($arrComponentesDigitais)){ - $arrComponentesDigitais = array($arrComponentesDigitais); - } + if (!isset($objDocumento->retirado) || $objDocumento->retirado == false) { + $arrComponentesDigitais = $objDocumento->componentesDigitais; foreach ($arrComponentesDigitais as $componenteDigital) { + + if (is_array($componenteDigital)) { + $componenteDigital = (object) $componenteDigital; + } //Busca o nome do documento $nomeDocumento = $componenteDigital->nome; @@ -2639,12 +2669,17 @@ private function obterTamanhoComponenteDigitalPendente($parObjProtocolo, $parCom $arrObjDocumentos = ProcessoEletronicoRN::obterDocumentosProtocolo($parObjProtocolo); //Percorre os documentos e compoenntes para pegar o tamanho em bytes do componente - foreach ($arrObjDocumentos as $objDocumento){ + foreach ($arrObjDocumentos as $objDocumento) { $arrObjComponentesDigitais = ProcessoEletronicoRN::obterComponentesDigitaisDocumento($objDocumento); - foreach ($arrObjComponentesDigitais as $objComponentesDigital){ - if(ProcessoEletronicoRN::getHashFromMetaDados($objComponentesDigital->hash) == $parComponentePendente){ + foreach ($arrObjComponentesDigitais as $objComponentesDigital) { + + if (is_array($objComponentesDigital)) { + $objComponentesDigital = (object) $objComponentesDigital; + } + + if (ProcessoEletronicoRN::getHashFromMetaDados($objComponentesDigital->hash) == $parComponentePendente) { $tamanhoComponentePendende = $objComponentesDigital->tamanhoEmBytes; - break; + break; } } } @@ -2716,11 +2751,16 @@ private function indexarComponenteDigitaisDoProtocolo($parObjProtocolo) { $resultado = array(); $arrObjDocumentos = ProcessoEletronicoRN::obterDocumentosProtocolo($parObjProtocolo); - foreach($arrObjDocumentos as $objDocumento){ - if(isset($objDocumento->componenteDigital) && !is_array($objDocumento->componenteDigital)){ - $objDocumento->componenteDigital = array($objDocumento->componenteDigital); + foreach ($arrObjDocumentos as $arrDocumento) { + if(isset($arrDocumento->componentesDigitais) && !is_array($arrDocumento->componentesDigitais)){ + $arrDocumento->componentesDigitais = array($arrDocumento->componentesDigitais); } - foreach($objDocumento->componenteDigital as $objComponente){ + foreach ($arrDocumento->componentesDigitais as $objComponente) { + + if (is_array($objComponente)) { + $objComponente = (object) $objComponente; + } + $strHash = ProcessoEletronicoRN::getHashFromMetaDados($objComponente->hash); $resultado[$strHash] = $objComponente; } @@ -2950,4 +2990,4 @@ private function atribuirTipoProcedimentoRelacinado($numIdTipoProcedimento, $num $objAtividadeRN = new AtividadeRN(); $objAtividadeRN->gerarInternaRN0727($objAtividadeDTO); } -} +} \ No newline at end of file diff --git a/src/rn/ReceberReciboTramiteRN.php b/src/rn/ReceberReciboTramiteRN.php index 2d12b8d9d..a1faae3c5 100755 --- a/src/rn/ReceberReciboTramiteRN.php +++ b/src/rn/ReceberReciboTramiteRN.php @@ -37,7 +37,6 @@ public function receberReciboDeTramite($parNumIdTramite) throw new InfraException("Não foi possível obter recibo de conclusão do trâmite '$parNumIdTramite'"); } - $objReciboTramite = $objReciboTramite->conteudoDoReciboDeTramite; // Inicialização do recebimento do processo, abrindo nova transação e controle de concorrência, // evitando processamento simultâneo de cadastramento do mesmo processo @@ -227,7 +226,7 @@ private function registrarRecebimentoRecibo($numIdProcedimento, $strProtocoloFor if (isset($objEstrutura->hierarquia)) { - $arrObjNivel = $objEstrutura->hierarquia->nivel; + $arrObjNivel = $objEstrutura->hierarquia; $nome = ""; $siglasUnidades = array(); diff --git a/src/rn/VerificadorInstalacaoRN.php b/src/rn/VerificadorInstalacaoRN.php index 494d115ba..80965376d 100755 --- a/src/rn/VerificadorInstalacaoRN.php +++ b/src/rn/VerificadorInstalacaoRN.php @@ -233,12 +233,14 @@ public function verificarConexaoBarramentoPEN() $strLocalizacaoCertificadoDigital = $objConfiguracaoModPEN->getValor("PEN", "LocalizacaoCertificado"); $strSenhaCertificadoDigital = $objConfiguracaoModPEN->getValor("PEN", "SenhaCertificado"); - $strEnderecoWSDL = $strEnderecoWebService . '?wsdl'; - $curl = curl_init($strEnderecoWSDL); + $healthcheck = 'healthcheck'; + + $strEnderecoBarramento = $strEnderecoWebService . '/' . $healthcheck; + $curl = curl_init($strEnderecoBarramento); try{ $bolEmProducao = boolval(ConfiguracaoSEI::getInstance()->getValor('SEI', 'Producao')); - curl_setopt($curl, CURLOPT_URL, $strEnderecoWSDL); + curl_setopt($curl, CURLOPT_URL, $strEnderecoBarramento); curl_setopt($curl, CURLOPT_HEADER, 0); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); @@ -254,12 +256,7 @@ public function verificarConexaoBarramentoPEN() $strErrorMsg = curl_error($curl); } if (isset($strErrorMsg)) { - throw new Exception("Erro no CURL ao obter o WSDL em $strEnderecoWSDL. Erro detalhado: $strErrorMsg."); - } - $objXML = simplexml_load_string($strOutput); - - if(empty($strOutput) || $strOutput === false || empty($objXML) || $objXML === false){ - throw new Exception("Falha na validação do WSDL do webservice de integração com o Tramita GOV.BR localizado em $strEnderecoWSDL"); + throw new Exception("Erro no CURL para $strEnderecoBarramento. Erro detalhado: $strErrorMsg."); } } finally{ @@ -282,6 +279,7 @@ public function verificarAcessoPendenciasTramitePEN() try{ $objProcessoEletronicoRN = new ProcessoEletronicoRN(); $objProcessoEletronicoRN->listarPendencias(false); + return true; } catch(Exception $e){ throw new InfraException("Falha no acesso aos serviços de integração do Tramita GOV.BR: $e"); diff --git a/tests_sei4/funcional/assets/config/ConfiguracaoModPEN.exemplo.php b/tests_sei4/funcional/assets/config/ConfiguracaoModPEN.exemplo.php deleted file mode 100644 index 8934a1108..000000000 --- a/tests_sei4/funcional/assets/config/ConfiguracaoModPEN.exemplo.php +++ /dev/null @@ -1,99 +0,0 @@ - array( - // Endereço do Web Service principal de integração com o Barramento de Serviços do PEN - // Os endereços disponíveis são os seguintes (verifique se houve atualizações durante o procedimento de instalação): - // - Homologação: https://homolog.api.processoeletronico.gov.br/interoperabilidade/soap/v3/ - // - Produção: https://api.conectagov.processoeletronico.gov.br/interoperabilidade/soap/v3/ - "WebService" => "https://homolog.api.processoeletronico.gov.br/interoperabilidade/soap/v3/", - - // Endereço do Web Service de monitoramente de pendências de trâmite no Barramento de Serviços do PEN - // Configuração necessária para que o envio e recebimento de processos sejam feitas de forma dinâmica pelo sistema - // Os endereços disponíveis são os seguintes (verifique se houve atualizações durante o procedimento de instalação): - // - Homologação: https://homolog.pendencias.processoeletronico.gov.br/ - // - Produção: https://pendencias.conectagov.processoeletronico.gov.br/ - "WebServicePendencias" => "", - - // Localização completa do certificado digital utilizado para autenticação nos serviços do Barramento de Serviços do PEN - // e assinar os recibos de envio/conclusão dos trâmites de processo - // Necessário que o arquivo de certificado esteja localizado dentro da pasta de configurações do módulo: - // Ex: /sei/config/mod-pen/certificado.pem - "LocalizacaoCertificado" => getenv('CERTIFICADO'), - - // Senha do certificado digital necessário para a aplicação descriptografar a chave privada - "SenhaCertificado" => getenv('CERTIFICADO_SENHA'), - - // Quantidade de tentativas de requisção dos serviços do Barramento PEN antes que um erro possa ser lançado pela aplicação - // Necessário para aumentar a resiliência da integração em contextos de instabilidade de rede. - // Valor padrão: 3 - "NumeroTentativasErro" => 3, - - // Localização do servidor Gearman de gerenciamento de fila de processamento de tarefas do Barramento PEN - // As mensagem recebidas são organizadas em filas de tarefas e distribuídas entre os nós da aplicação para - // processamento paralelo. Caso este parâmetro não seja configurado ou o servidor este indisponível, o processamento será - // feito diretamente pelo sistema na periodicidade definida pelo agendamento da tarefa PENAgendamento::receberProcessos - // "Gearman" => array( - // "Servidor" => "", - // "Porta" => "", //Padrão: 4730 - // ) - - "ControleURL" => array( - "atual"=>"servidor.gov.br", - "antigos"=>array( - "[servidor_php]", - "[servidor_php2]", - ) - ), - - // Configuração padrão do Envio Parcial - "EnviarApenasComponentesDigitaisPendentes" => false - // "EnviarApenasComponentesDigitaisPendentes" => array( - // "1" => array( // 1 = Poder Executivo Federal - // "123456", // Id de estrutura de unidade X do Poder Executivo Federal - // "234567", // Id de estrutura de unidade Y do Poder Executivo Federal - // "345678" // Id de estrutura de unidade Z do Poder Executivo Federal - // ), - // "21" => array( // 2 = Poder Legislativo Federal - // "123456", // Id de estrutura de unidade X do Poder Executivo Federal - // "234567", // Id de estrutura de unidade Y do Poder Executivo Federal - // "345678" // Id de estrutura de unidade Z do Poder Executivo Federal - // ) - // ) - - ) - ); - } -} \ No newline at end of file diff --git a/tests_sei4/funcional/assets/config/ConfiguracaoModPEN.php b/tests_sei4/funcional/assets/config/ConfiguracaoModPEN.php index 2d86f9cc6..fc4c5768f 100755 --- a/tests_sei4/funcional/assets/config/ConfiguracaoModPEN.php +++ b/tests_sei4/funcional/assets/config/ConfiguracaoModPEN.php @@ -36,9 +36,9 @@ public function getArrConfiguracoes() "PEN" => array( // Endereço do Web Service principal de integração com o Barramento de Serviços do PEN // Os endereços disponíveis são os seguintes (verifique se houve atualizações durante o procedimento de instalação): - // - Homologação: https://homolog.api.processoeletronico.gov.br/interoperabilidade/soap/v3/ - // - Produção: https://api.conectagov.processoeletronico.gov.br/interoperabilidade/soap/v3/ - "WebService" => "https://homolog.api.processoeletronico.gov.br/interoperabilidade/soap/v3/", + // - Homologação: https://homolog.api.processoeletronico.gov.br/interoperabilidade/rest/v3/ + // - Produção: https://api.conectagov.processoeletronico.gov.br/interoperabilidade/rest/v3/ + "WebService" => "https://homolog.api.processoeletronico.gov.br/interoperabilidade/rest/v3/", // Endereço do Web Service de monitoramente de pendências de trâmite no Barramento de Serviços do PEN // Configuração necessária para que o envio e recebimento de processos sejam feitas de forma dinâmica pelo sistema diff --git a/tests_sei4/funcional/assets/config/composer.json b/tests_sei4/funcional/assets/config/composer.json new file mode 100644 index 000000000..b1507ec37 --- /dev/null +++ b/tests_sei4/funcional/assets/config/composer.json @@ -0,0 +1,18 @@ +{ + "config": { + "platform": { + "php": "7.3.12" + } + }, + + + "require-dev": { + "phpunit/phpunit": "8.*", + "phpunit/php-code-coverage": "*", + "phpunit/phpunit-selenium": "*", + "besimple/soap": "*", + "brandonwamboldt/utilphp": "1.1.*", + "brianium/paratest": "4.*", + "guzzlehttp/guzzle": "^7.0" + } +} \ No newline at end of file diff --git a/tests_sei4/funcional/bootstrap.php b/tests_sei4/funcional/bootstrap.php index 2d202ecd5..9cb5fdddb 100755 --- a/tests_sei4/funcional/bootstrap.php +++ b/tests_sei4/funcional/bootstrap.php @@ -1,6 +1,8 @@ setStrNomeUnidadeRestricao($dados['NomeUnidadeRestricao']); - $objPenUnidadeRestricaoDTO->setStrNomeUnidadeRHRestricao($dados['NomeUnidadeRHRestricao']); + $objPenUnidadeRestricaoDTO->setStrNomeUnidadeRHRestricao($dados['NomeUnidadeRHRestricao']."%", InfraDTO::$OPER_LIKE); $objPenUnidadeRestricaoDTO->retTodos(); $objPenUnidadeRestricaoBD = new \PenUnidadeRestricaoBD($this->inicializarObjInfraIBanco()); diff --git a/tests_sei4/funcional/tests/CenarioBaseTestCase.php b/tests_sei4/funcional/tests/CenarioBaseTestCase.php index c9d4026fc..a9f22ee13 100755 --- a/tests_sei4/funcional/tests/CenarioBaseTestCase.php +++ b/tests_sei4/funcional/tests/CenarioBaseTestCase.php @@ -501,7 +501,6 @@ protected function validarDadosDocumento($nomeDocArvore, $dadosDocumento, $desti // Verifica se documento possui marcação de documento anexado $bolPossuiDocumentoReferenciado = !is_null($dadosDocumento['ORDEM_DOCUMENTO_REFERENCIADO']); - $this->assertTrue($this->paginaProcesso->deveSerDocumentoAnexo($bolPossuiDocumentoReferenciado, $nomeDocArvore)); if (($this->paginaProcesso->ehDocumentoCancelado($nomeDocArvore) == false) and ($this->paginaProcesso->ehDocumentoMovido($nomeDocArvore) == false)) { diff --git a/tests_sei4/funcional/tests/TramiteProcessoContendoDocumentoBeSimpleCorrompidoTest.php b/tests_sei4/funcional/tests/TramiteProcessoContendoDocumentoBeSimpleCorrompidoTest.php deleted file mode 100755 index 214e32b16..000000000 --- a/tests_sei4/funcional/tests/TramiteProcessoContendoDocumentoBeSimpleCorrompidoTest.php +++ /dev/null @@ -1,132 +0,0 @@ -setSeleniumServerRequestsTimeout(6000); - - // Configuração do dados para teste do cenário - self::$remetente = $this->definirContextoTeste(CONTEXTO_ORGAO_A); - self::$destinatario = $this->definirContextoTeste(CONTEXTO_ORGAO_B); - self::$processoTeste = $this->gerarDadosProcessoTeste(self::$remetente); - self::$documentoTeste = $this->gerarDadosDocumentoExternoTeste(self::$remetente, 'arquivo_corrompimento_besimplesoap.pdf'); - - // Cadastrar novo processo de teste - $objProtocoloDTO = $this->cadastrarProcessoFixture(self::$processoTeste); - $this->cadastrarDocumentoExternoFixture(self::$documentoTeste, $objProtocoloDTO->getDblIdProtocolo()); - self::$protocoloTeste = $objProtocoloDTO->getStrProtocoloFormatado(); - - - // Acessar sistema do this->REMETENTE do processo - $this->acessarSistema(self::$remetente['URL'], self::$remetente['SIGLA_UNIDADE'], self::$remetente['LOGIN'], self::$remetente['SENHA']); - - $this->abrirProcesso(self::$protocoloTeste); - - // Trâmitar Externamento processo para órgão/unidade destinatária - $this->tramitarProcessoExternamente( - self::$protocoloTeste, self::$destinatario['REP_ESTRUTURAS'], self::$destinatario['NOME_UNIDADE'], - self::$destinatario['SIGLA_UNIDADE_HIERARQUIA'], false, null, PEN_WAIT_TIMEOUT_ARQUIVOS_GRANDES); - } - - - /** - * Teste de verificação do correto envio do processo no sistema remetente - * - * @group verificacao_envio - * @large - * - * @depends test_tramitar_processo_contendo_documento_besimple - * - * @return void - */ - public function test_verificar_origem_processo_contendo_documento_besimple() - { - $orgaosDiferentes = self::$remetente['URL'] != self::$destinatario['URL']; - - $this->acessarSistema(self::$remetente['URL'], self::$remetente['SIGLA_UNIDADE'], self::$remetente['LOGIN'], self::$remetente['SENHA']); - - $this->abrirProcesso(self::$protocoloTeste); - - // 6 - Verificar se situação atual do processo está como bloqueado - $this->waitUntil(function($testCase) use (&$orgaosDiferentes) { - sleep(5); - $testCase->refresh(); - $paginaProcesso = new PaginaProcesso($testCase); - $testCase->assertStringNotContainsString(mb_convert_encoding("Processo em trâmite externo para ", 'UTF-8', 'ISO-8859-1'), $paginaProcesso->informacao()); - $testCase->assertFalse($paginaProcesso->processoAberto()); - $testCase->assertEquals($orgaosDiferentes, $paginaProcesso->processoBloqueado()); - return true; - }, PEN_WAIT_TIMEOUT); - - // 7 - Validar se recibo de trâmite foi armazenado para o processo (envio e conclusão) - $unidade = mb_convert_encoding(self::$destinatario['NOME_UNIDADE'], "ISO-8859-1"); - $mensagemRecibo = sprintf("Trâmite externo do Processo %s para %s", self::$protocoloTeste, $unidade); - $this->validarRecibosTramite($mensagemRecibo, true, true); - - // 8 - Validar histórico de trâmite do processo - $this->validarHistoricoTramite(self::$destinatario['NOME_UNIDADE'], true, true); - - // 9 - Verificar se processo está na lista de Processos Tramitados Externamente - $this->validarProcessosTramitados(self::$protocoloTeste, $orgaosDiferentes); - } - - - /** - * Teste de verificação do correto recebimento do processo contendo apenas um documento interno (gerado) - * - * @group verificacao_recebimento - * @large - * - * @depends test_verificar_origem_processo_contendo_documento_besimple - * - * @return void - */ - public function test_verificar_destino_processo_contendo_documento_besimple() - { - $strProtocoloTeste = self::$protocoloTeste; - $orgaosDiferentes = self::$remetente['URL'] != self::$destinatario['URL']; - - $this->acessarSistema(self::$destinatario['URL'], self::$destinatario['SIGLA_UNIDADE'], self::$destinatario['LOGIN'], self::$destinatario['SENHA']); - - // 11 - Abrir protocolo na tela de controle de processos - $this->abrirProcesso(self::$protocoloTeste); - $listaDocumentos = $this->paginaProcesso->listarDocumentos(); - - // 12 - Validar dados do processo - $strTipoProcesso = mb_convert_encoding("Tipo de processo no órgão de origem: ", 'UTF-8', 'ISO-8859-1'); - $strTipoProcesso .= self::$processoTeste['TIPO_PROCESSO']; - self::$processoTeste['OBSERVACOES'] = $orgaosDiferentes ? $strTipoProcesso : null; - $this->validarDadosProcesso(self::$processoTeste['DESCRICAO'], self::$processoTeste['RESTRICAO'], self::$processoTeste['OBSERVACOES'], array(self::$processoTeste['INTERESSADOS'])); - - // 13 - Verificar recibos de trâmite - $this->validarRecibosTramite("Recebimento do Processo $strProtocoloTeste", false, true); - - // 14 - Validar dados do documento - $this->assertTrue(count($listaDocumentos) == 1); - $this->validarDadosDocumento($listaDocumentos[0], self::$documentoTeste, self::$destinatario); - } -} diff --git a/tests_sei41/funcional/assets/config/ConfiguracaoModPEN.exemplo.php b/tests_sei41/funcional/assets/config/ConfiguracaoModPEN.exemplo.php deleted file mode 100644 index 8934a1108..000000000 --- a/tests_sei41/funcional/assets/config/ConfiguracaoModPEN.exemplo.php +++ /dev/null @@ -1,99 +0,0 @@ - array( - // Endereço do Web Service principal de integração com o Barramento de Serviços do PEN - // Os endereços disponíveis são os seguintes (verifique se houve atualizações durante o procedimento de instalação): - // - Homologação: https://homolog.api.processoeletronico.gov.br/interoperabilidade/soap/v3/ - // - Produção: https://api.conectagov.processoeletronico.gov.br/interoperabilidade/soap/v3/ - "WebService" => "https://homolog.api.processoeletronico.gov.br/interoperabilidade/soap/v3/", - - // Endereço do Web Service de monitoramente de pendências de trâmite no Barramento de Serviços do PEN - // Configuração necessária para que o envio e recebimento de processos sejam feitas de forma dinâmica pelo sistema - // Os endereços disponíveis são os seguintes (verifique se houve atualizações durante o procedimento de instalação): - // - Homologação: https://homolog.pendencias.processoeletronico.gov.br/ - // - Produção: https://pendencias.conectagov.processoeletronico.gov.br/ - "WebServicePendencias" => "", - - // Localização completa do certificado digital utilizado para autenticação nos serviços do Barramento de Serviços do PEN - // e assinar os recibos de envio/conclusão dos trâmites de processo - // Necessário que o arquivo de certificado esteja localizado dentro da pasta de configurações do módulo: - // Ex: /sei/config/mod-pen/certificado.pem - "LocalizacaoCertificado" => getenv('CERTIFICADO'), - - // Senha do certificado digital necessário para a aplicação descriptografar a chave privada - "SenhaCertificado" => getenv('CERTIFICADO_SENHA'), - - // Quantidade de tentativas de requisção dos serviços do Barramento PEN antes que um erro possa ser lançado pela aplicação - // Necessário para aumentar a resiliência da integração em contextos de instabilidade de rede. - // Valor padrão: 3 - "NumeroTentativasErro" => 3, - - // Localização do servidor Gearman de gerenciamento de fila de processamento de tarefas do Barramento PEN - // As mensagem recebidas são organizadas em filas de tarefas e distribuídas entre os nós da aplicação para - // processamento paralelo. Caso este parâmetro não seja configurado ou o servidor este indisponível, o processamento será - // feito diretamente pelo sistema na periodicidade definida pelo agendamento da tarefa PENAgendamento::receberProcessos - // "Gearman" => array( - // "Servidor" => "", - // "Porta" => "", //Padrão: 4730 - // ) - - "ControleURL" => array( - "atual"=>"servidor.gov.br", - "antigos"=>array( - "[servidor_php]", - "[servidor_php2]", - ) - ), - - // Configuração padrão do Envio Parcial - "EnviarApenasComponentesDigitaisPendentes" => false - // "EnviarApenasComponentesDigitaisPendentes" => array( - // "1" => array( // 1 = Poder Executivo Federal - // "123456", // Id de estrutura de unidade X do Poder Executivo Federal - // "234567", // Id de estrutura de unidade Y do Poder Executivo Federal - // "345678" // Id de estrutura de unidade Z do Poder Executivo Federal - // ), - // "21" => array( // 2 = Poder Legislativo Federal - // "123456", // Id de estrutura de unidade X do Poder Executivo Federal - // "234567", // Id de estrutura de unidade Y do Poder Executivo Federal - // "345678" // Id de estrutura de unidade Z do Poder Executivo Federal - // ) - // ) - - ) - ); - } -} \ No newline at end of file diff --git a/tests_sei41/funcional/assets/config/ConfiguracaoModPEN.php b/tests_sei41/funcional/assets/config/ConfiguracaoModPEN.php index 042c57061..d3ceafb68 100755 --- a/tests_sei41/funcional/assets/config/ConfiguracaoModPEN.php +++ b/tests_sei41/funcional/assets/config/ConfiguracaoModPEN.php @@ -36,9 +36,9 @@ public function getArrConfiguracoes() "PEN" => array( // Endereço do Web Service principal de integração com o Barramento de Serviços do PEN // Os endereços disponíveis são os seguintes (verifique se houve atualizações durante o procedimento de instalação): - // - Homologação: https://homolog.api.processoeletronico.gov.br/interoperabilidade/soap/v3/ - // - Produção: https://api.conectagov.processoeletronico.gov.br/interoperabilidade/soap/v3/ - "WebService" => "https://homolog.api.processoeletronico.gov.br/interoperabilidade/soap/v3/", + // - Homologação: https://homolog.api.processoeletronico.gov.br/interoperabilidade/rest/v3/ + // - Produção: https://api.conectagov.processoeletronico.gov.br/interoperabilidade/rest/v3/ + "WebService" => "https://homolog.api.processoeletronico.gov.br/interoperabilidade/rest/v3/", // Endereço do Web Service de monitoramente de pendências de trâmite no Barramento de Serviços do PEN // Configuração necessária para que o envio e recebimento de processos sejam feitas de forma dinâmica pelo sistema diff --git a/tests_sei41/funcional/assets/config/composer.json b/tests_sei41/funcional/assets/config/composer.json new file mode 100644 index 000000000..b1507ec37 --- /dev/null +++ b/tests_sei41/funcional/assets/config/composer.json @@ -0,0 +1,18 @@ +{ + "config": { + "platform": { + "php": "7.3.12" + } + }, + + + "require-dev": { + "phpunit/phpunit": "8.*", + "phpunit/php-code-coverage": "*", + "phpunit/phpunit-selenium": "*", + "besimple/soap": "*", + "brandonwamboldt/utilphp": "1.1.*", + "brianium/paratest": "4.*", + "guzzlehttp/guzzle": "^7.0" + } +} \ No newline at end of file diff --git a/tests_sei41/funcional/bootstrap.php b/tests_sei41/funcional/bootstrap.php index 159d03b50..df4d2e17e 100755 --- a/tests_sei41/funcional/bootstrap.php +++ b/tests_sei41/funcional/bootstrap.php @@ -1,6 +1,8 @@ setStrNomeUnidadeRestricao($dados['NomeUnidadeRestricao']); - $objPenUnidadeRestricaoDTO->setStrNomeUnidadeRHRestricao($dados['NomeUnidadeRHRestricao']); + $objPenUnidadeRestricaoDTO->setStrNomeUnidadeRHRestricao($dados['NomeUnidadeRHRestricao']."%", InfraDTO::$OPER_LIKE); $objPenUnidadeRestricaoDTO->retTodos(); $objPenUnidadeRestricaoBD = new \PenUnidadeRestricaoBD($this->inicializarObjInfraIBanco()); diff --git a/tests_sei41/funcional/tests/CenarioBaseTestCase.php b/tests_sei41/funcional/tests/CenarioBaseTestCase.php index 241afa5d0..81f23c539 100755 --- a/tests_sei41/funcional/tests/CenarioBaseTestCase.php +++ b/tests_sei41/funcional/tests/CenarioBaseTestCase.php @@ -503,7 +503,6 @@ protected function validarDadosDocumento($nomeDocArvore, $dadosDocumento, $desti // Verifica se documento possui marcação de documento anexado $bolPossuiDocumentoReferenciado = !is_null($dadosDocumento['ORDEM_DOCUMENTO_REFERENCIADO']); - $this->assertTrue($this->paginaProcesso->deveSerDocumentoAnexo($bolPossuiDocumentoReferenciado, $nomeDocArvore)); if (($this->paginaProcesso->ehDocumentoCancelado($nomeDocArvore) == false) and ($this->paginaProcesso->ehDocumentoMovido($nomeDocArvore) == false)) { diff --git a/tests_sei41/funcional/tests/TramiteProcessoContendoDocumentoBeSimpleCorrompidoTest.php b/tests_sei41/funcional/tests/TramiteProcessoContendoDocumentoBeSimpleCorrompidoTest.php deleted file mode 100755 index 214e32b16..000000000 --- a/tests_sei41/funcional/tests/TramiteProcessoContendoDocumentoBeSimpleCorrompidoTest.php +++ /dev/null @@ -1,132 +0,0 @@ -setSeleniumServerRequestsTimeout(6000); - - // Configuração do dados para teste do cenário - self::$remetente = $this->definirContextoTeste(CONTEXTO_ORGAO_A); - self::$destinatario = $this->definirContextoTeste(CONTEXTO_ORGAO_B); - self::$processoTeste = $this->gerarDadosProcessoTeste(self::$remetente); - self::$documentoTeste = $this->gerarDadosDocumentoExternoTeste(self::$remetente, 'arquivo_corrompimento_besimplesoap.pdf'); - - // Cadastrar novo processo de teste - $objProtocoloDTO = $this->cadastrarProcessoFixture(self::$processoTeste); - $this->cadastrarDocumentoExternoFixture(self::$documentoTeste, $objProtocoloDTO->getDblIdProtocolo()); - self::$protocoloTeste = $objProtocoloDTO->getStrProtocoloFormatado(); - - - // Acessar sistema do this->REMETENTE do processo - $this->acessarSistema(self::$remetente['URL'], self::$remetente['SIGLA_UNIDADE'], self::$remetente['LOGIN'], self::$remetente['SENHA']); - - $this->abrirProcesso(self::$protocoloTeste); - - // Trâmitar Externamento processo para órgão/unidade destinatária - $this->tramitarProcessoExternamente( - self::$protocoloTeste, self::$destinatario['REP_ESTRUTURAS'], self::$destinatario['NOME_UNIDADE'], - self::$destinatario['SIGLA_UNIDADE_HIERARQUIA'], false, null, PEN_WAIT_TIMEOUT_ARQUIVOS_GRANDES); - } - - - /** - * Teste de verificação do correto envio do processo no sistema remetente - * - * @group verificacao_envio - * @large - * - * @depends test_tramitar_processo_contendo_documento_besimple - * - * @return void - */ - public function test_verificar_origem_processo_contendo_documento_besimple() - { - $orgaosDiferentes = self::$remetente['URL'] != self::$destinatario['URL']; - - $this->acessarSistema(self::$remetente['URL'], self::$remetente['SIGLA_UNIDADE'], self::$remetente['LOGIN'], self::$remetente['SENHA']); - - $this->abrirProcesso(self::$protocoloTeste); - - // 6 - Verificar se situação atual do processo está como bloqueado - $this->waitUntil(function($testCase) use (&$orgaosDiferentes) { - sleep(5); - $testCase->refresh(); - $paginaProcesso = new PaginaProcesso($testCase); - $testCase->assertStringNotContainsString(mb_convert_encoding("Processo em trâmite externo para ", 'UTF-8', 'ISO-8859-1'), $paginaProcesso->informacao()); - $testCase->assertFalse($paginaProcesso->processoAberto()); - $testCase->assertEquals($orgaosDiferentes, $paginaProcesso->processoBloqueado()); - return true; - }, PEN_WAIT_TIMEOUT); - - // 7 - Validar se recibo de trâmite foi armazenado para o processo (envio e conclusão) - $unidade = mb_convert_encoding(self::$destinatario['NOME_UNIDADE'], "ISO-8859-1"); - $mensagemRecibo = sprintf("Trâmite externo do Processo %s para %s", self::$protocoloTeste, $unidade); - $this->validarRecibosTramite($mensagemRecibo, true, true); - - // 8 - Validar histórico de trâmite do processo - $this->validarHistoricoTramite(self::$destinatario['NOME_UNIDADE'], true, true); - - // 9 - Verificar se processo está na lista de Processos Tramitados Externamente - $this->validarProcessosTramitados(self::$protocoloTeste, $orgaosDiferentes); - } - - - /** - * Teste de verificação do correto recebimento do processo contendo apenas um documento interno (gerado) - * - * @group verificacao_recebimento - * @large - * - * @depends test_verificar_origem_processo_contendo_documento_besimple - * - * @return void - */ - public function test_verificar_destino_processo_contendo_documento_besimple() - { - $strProtocoloTeste = self::$protocoloTeste; - $orgaosDiferentes = self::$remetente['URL'] != self::$destinatario['URL']; - - $this->acessarSistema(self::$destinatario['URL'], self::$destinatario['SIGLA_UNIDADE'], self::$destinatario['LOGIN'], self::$destinatario['SENHA']); - - // 11 - Abrir protocolo na tela de controle de processos - $this->abrirProcesso(self::$protocoloTeste); - $listaDocumentos = $this->paginaProcesso->listarDocumentos(); - - // 12 - Validar dados do processo - $strTipoProcesso = mb_convert_encoding("Tipo de processo no órgão de origem: ", 'UTF-8', 'ISO-8859-1'); - $strTipoProcesso .= self::$processoTeste['TIPO_PROCESSO']; - self::$processoTeste['OBSERVACOES'] = $orgaosDiferentes ? $strTipoProcesso : null; - $this->validarDadosProcesso(self::$processoTeste['DESCRICAO'], self::$processoTeste['RESTRICAO'], self::$processoTeste['OBSERVACOES'], array(self::$processoTeste['INTERESSADOS'])); - - // 13 - Verificar recibos de trâmite - $this->validarRecibosTramite("Recebimento do Processo $strProtocoloTeste", false, true); - - // 14 - Validar dados do documento - $this->assertTrue(count($listaDocumentos) == 1); - $this->validarDadosDocumento($listaDocumentos[0], self::$documentoTeste, self::$destinatario); - } -} diff --git a/tests_super/funcional/assets/config/ConfiguracaoModPEN.exemplo.php b/tests_super/funcional/assets/config/ConfiguracaoModPEN.exemplo.php deleted file mode 100644 index 8934a1108..000000000 --- a/tests_super/funcional/assets/config/ConfiguracaoModPEN.exemplo.php +++ /dev/null @@ -1,99 +0,0 @@ - array( - // Endereço do Web Service principal de integração com o Barramento de Serviços do PEN - // Os endereços disponíveis são os seguintes (verifique se houve atualizações durante o procedimento de instalação): - // - Homologação: https://homolog.api.processoeletronico.gov.br/interoperabilidade/soap/v3/ - // - Produção: https://api.conectagov.processoeletronico.gov.br/interoperabilidade/soap/v3/ - "WebService" => "https://homolog.api.processoeletronico.gov.br/interoperabilidade/soap/v3/", - - // Endereço do Web Service de monitoramente de pendências de trâmite no Barramento de Serviços do PEN - // Configuração necessária para que o envio e recebimento de processos sejam feitas de forma dinâmica pelo sistema - // Os endereços disponíveis são os seguintes (verifique se houve atualizações durante o procedimento de instalação): - // - Homologação: https://homolog.pendencias.processoeletronico.gov.br/ - // - Produção: https://pendencias.conectagov.processoeletronico.gov.br/ - "WebServicePendencias" => "", - - // Localização completa do certificado digital utilizado para autenticação nos serviços do Barramento de Serviços do PEN - // e assinar os recibos de envio/conclusão dos trâmites de processo - // Necessário que o arquivo de certificado esteja localizado dentro da pasta de configurações do módulo: - // Ex: /sei/config/mod-pen/certificado.pem - "LocalizacaoCertificado" => getenv('CERTIFICADO'), - - // Senha do certificado digital necessário para a aplicação descriptografar a chave privada - "SenhaCertificado" => getenv('CERTIFICADO_SENHA'), - - // Quantidade de tentativas de requisção dos serviços do Barramento PEN antes que um erro possa ser lançado pela aplicação - // Necessário para aumentar a resiliência da integração em contextos de instabilidade de rede. - // Valor padrão: 3 - "NumeroTentativasErro" => 3, - - // Localização do servidor Gearman de gerenciamento de fila de processamento de tarefas do Barramento PEN - // As mensagem recebidas são organizadas em filas de tarefas e distribuídas entre os nós da aplicação para - // processamento paralelo. Caso este parâmetro não seja configurado ou o servidor este indisponível, o processamento será - // feito diretamente pelo sistema na periodicidade definida pelo agendamento da tarefa PENAgendamento::receberProcessos - // "Gearman" => array( - // "Servidor" => "", - // "Porta" => "", //Padrão: 4730 - // ) - - "ControleURL" => array( - "atual"=>"servidor.gov.br", - "antigos"=>array( - "[servidor_php]", - "[servidor_php2]", - ) - ), - - // Configuração padrão do Envio Parcial - "EnviarApenasComponentesDigitaisPendentes" => false - // "EnviarApenasComponentesDigitaisPendentes" => array( - // "1" => array( // 1 = Poder Executivo Federal - // "123456", // Id de estrutura de unidade X do Poder Executivo Federal - // "234567", // Id de estrutura de unidade Y do Poder Executivo Federal - // "345678" // Id de estrutura de unidade Z do Poder Executivo Federal - // ), - // "21" => array( // 2 = Poder Legislativo Federal - // "123456", // Id de estrutura de unidade X do Poder Executivo Federal - // "234567", // Id de estrutura de unidade Y do Poder Executivo Federal - // "345678" // Id de estrutura de unidade Z do Poder Executivo Federal - // ) - // ) - - ) - ); - } -} \ No newline at end of file diff --git a/tests_super/funcional/assets/config/ConfiguracaoModPEN.php b/tests_super/funcional/assets/config/ConfiguracaoModPEN.php old mode 100755 new mode 100644 index 2d86f9cc6..5898b5adf --- a/tests_super/funcional/assets/config/ConfiguracaoModPEN.php +++ b/tests_super/funcional/assets/config/ConfiguracaoModPEN.php @@ -36,9 +36,9 @@ public function getArrConfiguracoes() "PEN" => array( // Endereço do Web Service principal de integração com o Barramento de Serviços do PEN // Os endereços disponíveis são os seguintes (verifique se houve atualizações durante o procedimento de instalação): - // - Homologação: https://homolog.api.processoeletronico.gov.br/interoperabilidade/soap/v3/ - // - Produção: https://api.conectagov.processoeletronico.gov.br/interoperabilidade/soap/v3/ - "WebService" => "https://homolog.api.processoeletronico.gov.br/interoperabilidade/soap/v3/", + // - Homologação: https://homolog.api.processoeletronico.gov.br/interoperabilidade/rest/v3/ + // - Produção: https://api.conectagov.processoeletronico.gov.br/interoperabilidade/rest/v3/ + "WebService" => "https://homolog.api.processoeletronico.gov.br/interoperabilidade/rest/v3/", // Endereço do Web Service de monitoramente de pendências de trâmite no Barramento de Serviços do PEN // Configuração necessária para que o envio e recebimento de processos sejam feitas de forma dinâmica pelo sistema @@ -80,7 +80,20 @@ public function getArrConfiguracoes() // Configuração padrão do Envio Parcial "EnviarApenasComponentesDigitaisPendentes" => false + // "EnviarApenasComponentesDigitaisPendentes" => array( + // "1" => array( // 1 = Poder Executivo Federal + // "123456", // Id de estrutura de unidade X do Poder Executivo Federal + // "234567", // Id de estrutura de unidade Y do Poder Executivo Federal + // "345678" // Id de estrutura de unidade Z do Poder Executivo Federal + // ), + // "21" => array( // 2 = Poder Legislativo Federal + // "123456", // Id de estrutura de unidade X do Poder Executivo Federal + // "234567", // Id de estrutura de unidade Y do Poder Executivo Federal + // "345678" // Id de estrutura de unidade Z do Poder Executivo Federal + // ) + // ) + ) ); } -} +} \ No newline at end of file diff --git a/tests_super/funcional/assets/config/composer.json b/tests_super/funcional/assets/config/composer.json new file mode 100644 index 000000000..b1507ec37 --- /dev/null +++ b/tests_super/funcional/assets/config/composer.json @@ -0,0 +1,18 @@ +{ + "config": { + "platform": { + "php": "7.3.12" + } + }, + + + "require-dev": { + "phpunit/phpunit": "8.*", + "phpunit/php-code-coverage": "*", + "phpunit/phpunit-selenium": "*", + "besimple/soap": "*", + "brandonwamboldt/utilphp": "1.1.*", + "brianium/paratest": "4.*", + "guzzlehttp/guzzle": "^7.0" + } +} \ No newline at end of file diff --git a/tests_super/funcional/bootstrap.php b/tests_super/funcional/bootstrap.php index 9bb6edcd3..68d9b9bd4 100755 --- a/tests_super/funcional/bootstrap.php +++ b/tests_super/funcional/bootstrap.php @@ -1,6 +1,8 @@ setStrNomeUnidadeRestricao($dados['NomeUnidadeRestricao']); - $objPenUnidadeRestricaoDTO->setStrNomeUnidadeRHRestricao($dados['NomeUnidadeRHRestricao']); + $objPenUnidadeRestricaoDTO->setStrNomeUnidadeRHRestricao($dados['NomeUnidadeRHRestricao']."%", InfraDTO::$OPER_LIKE); $objPenUnidadeRestricaoDTO->retTodos(); $objPenUnidadeRestricaoBD = new \PenUnidadeRestricaoBD($this->inicializarObjInfraIBanco()); diff --git a/tests_super/funcional/tests/CenarioBaseTestCase.php b/tests_super/funcional/tests/CenarioBaseTestCase.php index 6da11d142..4370fe59c 100755 --- a/tests_super/funcional/tests/CenarioBaseTestCase.php +++ b/tests_super/funcional/tests/CenarioBaseTestCase.php @@ -549,7 +549,6 @@ protected function validarDadosDocumento($nomeDocArvore, $dadosDocumento, $desti // Verifica se documento possui marcação de documento anexado $bolPossuiDocumentoReferenciado = !is_null($dadosDocumento['ORDEM_DOCUMENTO_REFERENCIADO']); - $this->assertTrue($this->paginaProcesso->deveSerDocumentoAnexo($bolPossuiDocumentoReferenciado, $nomeDocArvore)); if (($this->paginaProcesso->ehDocumentoCancelado($nomeDocArvore) == false) and ($this->paginaProcesso->ehDocumentoMovido($nomeDocArvore) == false)) { diff --git a/tests_super/funcional/tests/TramiteProcessoContendoDocumentoBeSimpleCorrompidoTest.php b/tests_super/funcional/tests/TramiteProcessoContendoDocumentoBeSimpleCorrompidoTest.php deleted file mode 100755 index 214e32b16..000000000 --- a/tests_super/funcional/tests/TramiteProcessoContendoDocumentoBeSimpleCorrompidoTest.php +++ /dev/null @@ -1,132 +0,0 @@ -setSeleniumServerRequestsTimeout(6000); - - // Configuração do dados para teste do cenário - self::$remetente = $this->definirContextoTeste(CONTEXTO_ORGAO_A); - self::$destinatario = $this->definirContextoTeste(CONTEXTO_ORGAO_B); - self::$processoTeste = $this->gerarDadosProcessoTeste(self::$remetente); - self::$documentoTeste = $this->gerarDadosDocumentoExternoTeste(self::$remetente, 'arquivo_corrompimento_besimplesoap.pdf'); - - // Cadastrar novo processo de teste - $objProtocoloDTO = $this->cadastrarProcessoFixture(self::$processoTeste); - $this->cadastrarDocumentoExternoFixture(self::$documentoTeste, $objProtocoloDTO->getDblIdProtocolo()); - self::$protocoloTeste = $objProtocoloDTO->getStrProtocoloFormatado(); - - - // Acessar sistema do this->REMETENTE do processo - $this->acessarSistema(self::$remetente['URL'], self::$remetente['SIGLA_UNIDADE'], self::$remetente['LOGIN'], self::$remetente['SENHA']); - - $this->abrirProcesso(self::$protocoloTeste); - - // Trâmitar Externamento processo para órgão/unidade destinatária - $this->tramitarProcessoExternamente( - self::$protocoloTeste, self::$destinatario['REP_ESTRUTURAS'], self::$destinatario['NOME_UNIDADE'], - self::$destinatario['SIGLA_UNIDADE_HIERARQUIA'], false, null, PEN_WAIT_TIMEOUT_ARQUIVOS_GRANDES); - } - - - /** - * Teste de verificação do correto envio do processo no sistema remetente - * - * @group verificacao_envio - * @large - * - * @depends test_tramitar_processo_contendo_documento_besimple - * - * @return void - */ - public function test_verificar_origem_processo_contendo_documento_besimple() - { - $orgaosDiferentes = self::$remetente['URL'] != self::$destinatario['URL']; - - $this->acessarSistema(self::$remetente['URL'], self::$remetente['SIGLA_UNIDADE'], self::$remetente['LOGIN'], self::$remetente['SENHA']); - - $this->abrirProcesso(self::$protocoloTeste); - - // 6 - Verificar se situação atual do processo está como bloqueado - $this->waitUntil(function($testCase) use (&$orgaosDiferentes) { - sleep(5); - $testCase->refresh(); - $paginaProcesso = new PaginaProcesso($testCase); - $testCase->assertStringNotContainsString(mb_convert_encoding("Processo em trâmite externo para ", 'UTF-8', 'ISO-8859-1'), $paginaProcesso->informacao()); - $testCase->assertFalse($paginaProcesso->processoAberto()); - $testCase->assertEquals($orgaosDiferentes, $paginaProcesso->processoBloqueado()); - return true; - }, PEN_WAIT_TIMEOUT); - - // 7 - Validar se recibo de trâmite foi armazenado para o processo (envio e conclusão) - $unidade = mb_convert_encoding(self::$destinatario['NOME_UNIDADE'], "ISO-8859-1"); - $mensagemRecibo = sprintf("Trâmite externo do Processo %s para %s", self::$protocoloTeste, $unidade); - $this->validarRecibosTramite($mensagemRecibo, true, true); - - // 8 - Validar histórico de trâmite do processo - $this->validarHistoricoTramite(self::$destinatario['NOME_UNIDADE'], true, true); - - // 9 - Verificar se processo está na lista de Processos Tramitados Externamente - $this->validarProcessosTramitados(self::$protocoloTeste, $orgaosDiferentes); - } - - - /** - * Teste de verificação do correto recebimento do processo contendo apenas um documento interno (gerado) - * - * @group verificacao_recebimento - * @large - * - * @depends test_verificar_origem_processo_contendo_documento_besimple - * - * @return void - */ - public function test_verificar_destino_processo_contendo_documento_besimple() - { - $strProtocoloTeste = self::$protocoloTeste; - $orgaosDiferentes = self::$remetente['URL'] != self::$destinatario['URL']; - - $this->acessarSistema(self::$destinatario['URL'], self::$destinatario['SIGLA_UNIDADE'], self::$destinatario['LOGIN'], self::$destinatario['SENHA']); - - // 11 - Abrir protocolo na tela de controle de processos - $this->abrirProcesso(self::$protocoloTeste); - $listaDocumentos = $this->paginaProcesso->listarDocumentos(); - - // 12 - Validar dados do processo - $strTipoProcesso = mb_convert_encoding("Tipo de processo no órgão de origem: ", 'UTF-8', 'ISO-8859-1'); - $strTipoProcesso .= self::$processoTeste['TIPO_PROCESSO']; - self::$processoTeste['OBSERVACOES'] = $orgaosDiferentes ? $strTipoProcesso : null; - $this->validarDadosProcesso(self::$processoTeste['DESCRICAO'], self::$processoTeste['RESTRICAO'], self::$processoTeste['OBSERVACOES'], array(self::$processoTeste['INTERESSADOS'])); - - // 13 - Verificar recibos de trâmite - $this->validarRecibosTramite("Recebimento do Processo $strProtocoloTeste", false, true); - - // 14 - Validar dados do documento - $this->assertTrue(count($listaDocumentos) == 1); - $this->validarDadosDocumento($listaDocumentos[0], self::$documentoTeste, self::$destinatario); - } -}