Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

485 garantir compatibilidade do modulo tramita com o sei 4 1 2 #503

Open
wants to merge 15 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 61 additions & 0 deletions docs/changelogs/CHANGELOG-3.7.0.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
# NOTAS DE VERSÃO MOD-SEI-PEN (versão 3.7.0)

Este documento descreve as principais mudanças aplicadas nesta versão do módulo de integração do SEI com o TRAMITA.GOV.BR.

As melhorias entregues em cada uma das versões são cumulativas, ou seja, contêm todas as implementações realizadas em versões anteriores.

## Compatibilidade de versões
* O módulo é compatível com as seguintes versões do **SEI**:
* 4.0.0 até 4.0.12,
* 4.1.1.

Para maiores informações sobre os procedimentos de instalação ou atualização, acesse os seguintes documentos localizados no pacote de distribuição mod-sei-pen-VERSAO.zip:
> Atenção: É impreterível seguir rigorosamente o disposto no README.md do Módulo para instalação ou atualização com sucesso.
* **INSTALACAO.md** - Procedimento de instalação e configuração do módulo
* **ATUALIZACAO.md** - Procedimento específicos para atualização de uma versão anterior

### Lista de melhorias e correções de problemas

Todas as atualizações podem incluir itens referentes à segurança, requisito em permanente monitoramento e evolução, motivo pelo qual a atualização com a maior brevidade possível é sempre recomendada.

#### aaaa (#000)

aaaaaaaa

#### aaaa (#000)

aaaaaaaa

### Atualização de Versão

Para obter informações detalhadas sobre cada um dos passos de atualização, vide arquivo **ATUALIZACAO.md**.

#### Instruções

1. Baixar a última versão do módulo de instalação do sistema (arquivo `mod-sei-pen-[VERSÃO].zip`) localizado na página de [Releases do projeto MOD-SEI-PEN](https://github.com/spbgovbr/mod-sei-pen/releases), seção **Assets**. _Somente usuários autorizados previamente pela Coordenação-Geral do Processo Eletrônico Nacional podem ter acesso às versões._

2. Fazer backup dos diretórios "sei", "sip" e "infra" do servidor web;

3. Descompactar o pacote de instalação `mod-sei-pen-[VERSÃO].zip`;

4. Copiar os diretórios descompactados "sei", "sip" para os servidores, sobrescrevendo os arquivos existentes;

5. Executar o script de instalação/atualização `sei_atualizar_versao_modulo_pen.php` do módulo para o SEI localizado no diretório `sei/scripts/mod-pen/`

```bash
php -c /etc/php.ini <DIRETÓRIO RAIZ DE INSTALAÇÃO DO SEI E SIP>/sei/scripts/mod-pen/sei_atualizar_versao_modulo_pen.php
```

6. Executar o script de instalação/atualização `sip_atualizar_versao_modulo_pen.php` do módulo para o SIP localizado no diretório `sip/scripts/mod-pen/`

```bash
php -c /etc/php.ini <DIRETÓRIO RAIZ DE INSTALAÇÃO DO SEI E SIP>/sip/scripts/mod-pen/sip_atualizar_versao_modulo_pen.php
```

7. Verificar a correta instalação e configuração do módulo

Para executar a verificação, execute o script ```verifica_instalacao_modulo_pen.php``` localizado no diretório de scripts do SEI ```<DIRETÓRIO RAIZ DE INSTALAÇÃO DO SEI E SIP>/sei/scripts/mod-pen/```.

```bash
$ php -c /etc/php.ini <DIRETÓRIO RAIZ DE INSTALAÇÃO DO SEI E SIP>/sei/scripts/mod-pen/verifica_instalacao_modulo_pen.php
```
38 changes: 34 additions & 4 deletions src/PENIntegracao.php
Original file line number Diff line number Diff line change
Expand Up @@ -164,11 +164,12 @@ public function montarBotaoProcesso(ProcedimentoAPI $objSeiIntegracaoDTO)
$strAcoesProcedimento .= '<img class="infraCorBarraSistema" src=' . ProcessoEletronicoINT::getCaminhoIcone("/pen_cancelar_tramite.gif", $this->getDiretorioImagens()) . ' alt="Cancelar Tramitação Externa" title="Cancelar Tramitação Externa" />';
$strAcoesProcedimento .= '</a>';
}

//Apresenta o botão de incluir processo no bloco de trâmite
$numTabBotao = $objPaginaSEI->getProxTabBarraComandosSuperior();
$strAcoesProcedimento .= '<a href="' . $objPaginaSEI->formatarXHTML($objSessaoSEI->assinarLink('controlador.php?acao=pen_incluir_processo_em_bloco_tramite&acao_origem=procedimento_visualizar&acao_retorno=arvore_visualizar&id_procedimento=' . $dblIdProcedimento . '&arvore=1')) . '" tabindex="' . $numTabBotao . '" class="botaoSEI"> <img src="'.ProcessoEletronicoINT::getCaminhoIcone("/pen_processo_bloco.svg", $this->getDiretorioImagens()) .'" title="Incluir Processo no Bloco de Trâmite" alt="Incluir Processo no Bloco de Trâmite"/></a>';

if ($bolFlagAberto && $bolAcaoExpedirProcesso && $bolProcessoEstadoNormal && $objProcedimentoDTO->getStrStaNivelAcessoGlobalProtocolo() != ProtocoloRN::$NA_SIGILOSO) {
$numTabBotao = $objPaginaSEI->getProxTabBarraComandosSuperior();
$strAcoesProcedimento .= '<a href="' . $objPaginaSEI->formatarXHTML($objSessaoSEI->assinarLink('controlador.php?acao=pen_incluir_processo_em_bloco_tramite&acao_origem=procedimento_visualizar&acao_retorno=arvore_visualizar&id_procedimento=' . $dblIdProcedimento . '&arvore=1')) . '" tabindex="' . $numTabBotao . '" class="botaoSEI"> <img src="'.ProcessoEletronicoINT::getCaminhoIcone("/pen_processo_bloco.svg", $this->getDiretorioImagens()) .'" title="Incluir Processo no Bloco de Trâmite" alt="Incluir Processo no Bloco de Trâmite"/></a>';
}

return array($strAcoesProcedimento);
}
Expand Down Expand Up @@ -1108,5 +1109,34 @@ public function processarPendencias()
SessaoSEI::getInstance(false);
ProcessarPendenciasRN::getInstance()->processarPendencias();
}

public function assinarDocumento($arrObjDocumentoAPI = array()){

$objProcessoEletronicoRN = new ProcessoEletronicoRN();

foreach($arrObjDocumentoAPI as $objDocumentoAPI){
//Pode ser assinado documentos de mais de um processo
$objProcessoEletronicoPesquisaDTO = new ProcessoEletronicoDTO();
$objProcessoEletronicoPesquisaDTO->setDblIdProcedimento($objDocumentoAPI->getIdProcedimento());
$objUltimoTramiteRecebidoDTO = $objProcessoEletronicoRN->consultarUltimoTramite($objProcessoEletronicoPesquisaDTO);

//Se não tiver trâmite não há o que se checar
if(!is_null($objUltimoTramiteRecebidoDTO)){
$arrObjComponentesDigitais = $objProcessoEletronicoRN->listarComponentesDigitais($objUltimoTramiteRecebidoDTO);
if(!is_null($arrObjComponentesDigitais)){
foreach($arrObjComponentesDigitais as $objComponentesDigitais){
if ($objComponentesDigitais->getDblIdDocumento() == $objDocumentoAPI->getIdDocumento()){
$nomeModulo = $this->getNome();
$mensagem = "$nomeModulo: Prezado(a) usuário(a) esse documento já foi tramitado externamente via Tramita GOV.BR. Por esse motivo, este documento não pode receber uma nova assinatura.";
LogSEI::getInstance()->gravar($mensagem, LogSEI::$AVISO);
$objInfraException = new InfraException();
$objInfraException->adicionarValidacao($mensagem);
$objInfraException->lancarValidacoes();
}
}
}
}
}
}
}
class ModuloIncompativelException extends InfraException { }
1 change: 1 addition & 0 deletions src/int/ProcessoEletronicoINT.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ class ProcessoEletronicoINT extends InfraINT {
const TEE_EXPEDICAO_ETAPA_PROCEDIMENTO = 'Enviando dados do processo %s';
const TEE_EXPEDICAO_ETAPA_DOCUMENTO = 'Enviando documento %s';
const TEE_EXPEDICAO_ETAPA_CONCLUSAO = 'Trâmite externo do processo finalizado com sucesso!';
const TEE_EXPEDICAO_LOTE_ETAPA_CONCLUSAO = 'Processo(s) aguardando envio. Favor acompanhar a tramitação por meio do bloco, na funcionalidade \'Blocos de Trâmite Externo\'';

/**
* Concate as siglas das hierarquias no nome da unidade
Expand Down
2 changes: 1 addition & 1 deletion src/pen_expedir_lote.php
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@
echo "<link href='$strDiretorioModulo/css/" . ProcessoEletronicoINT::getCssCompatibilidadeSEI4("pen_procedimento_expedir.css") . "' rel='stylesheet' type='text/css' media='all' />\n";
echo "<script type='text/javascript' charset='iso-8859-1' src='$strDiretorioModulo/js/expedir_processo/pen_procedimento_expedir.js?$numVersao'></script>";

$strTituloPagina = "Cadastro de processos em Lote";
$strTituloPagina = "Cadastro de processos em Bloco";
$objPaginaSEI->prepararBarraProgresso($strTitulo, $strTituloPagina);

try {
Expand Down
2 changes: 1 addition & 1 deletion src/rn/PenExpedirLoteRN.php
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ protected function cadastrarLoteControlado(PenExpedirLoteDTO $objPenExpedirLoteD
$objPenLoteProcedimentoRN->cadastrarLoteProcedimento($objPenLoteProcedimentoDTO);

$this->barraProgresso->mover($this->barraProgresso->getNumMax());
$this->barraProgresso->setStrRotulo(ProcessoEletronicoINT::TEE_EXPEDICAO_ETAPA_CONCLUSAO);
$this->barraProgresso->setStrRotulo(ProcessoEletronicoINT::TEE_EXPEDICAO_LOTE_ETAPA_CONCLUSAO);
} catch (\Exception $e) {
//Realiza o desbloqueio do processo
try {
Expand Down
8 changes: 2 additions & 6 deletions src/rn/ProcessoEletronicoRN.php
Original file line number Diff line number Diff line change
Expand Up @@ -652,14 +652,10 @@ public function enviarProcesso($parametros)
});

} catch (\SoapFault $e) {
$naoRespEstruturaOrg = 'Transação não autorizada, pois o sistema não é responsável pela estrutura organizacional remetente';
if (InfraString::formatarJavaScript(utf8_decode($e->faultstring)) == $naoRespEstruturaOrg) {
$strMensagem = "Por favor, observe o seguinte procedimento para realizar o mapeamento adequado: Acesse a funcionalidade Administração, em seguida selecione Tramita GOV.BR e, por fim, proceda ao mapeamento utilizando somente as unidades pertinentes ao seu órgão/entidade na funcionalidade Mapeamento de Unidades. Certifique-se de seguir esse processo para garantir a correta execução do mapeamento.";
} else {
$strMensagem = str_replace(array("\n", "\r"), ' ', InfraString::formatarJavaScript(utf8_decode($e->faultstring)));
}
if ($e instanceof \SoapFault && !empty($e->detail->interoperabilidadeException->codigoErro) && $e->detail->interoperabilidadeException->codigoErro == '0005') {
$$strMensagem .= 'O código mapeado para a unidade ' . utf8_decode($parametros->novoTramiteDeProcesso->processo->documento[0]->produtor->unidade->nome) . ' está incorreto.';
$strMensagem .= 'O código mapeado para a unidade ' . utf8_decode($parametros->novoTramiteDeProcesso->processo->documento[0]->produtor->unidade->nome) . ' está incorreto.';
}

$e->faultstring = $this->validarTramitaEmAndamento($parametros, $strMensagem);
Expand Down
1 change: 1 addition & 0 deletions tests_sei4/funcional/bootstrap.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,4 @@
require_once __DIR__ . '/src/paginas/PaginaEnvioParcialListar.php';

require_once __DIR__ . '/tests/CenarioBaseTestCase.php';
require_once __DIR__ . '/tests/FixtureCenarioBaseTestCase.php';
188 changes: 188 additions & 0 deletions tests_sei4/funcional/tests/FixtureCenarioBaseTestCase.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,188 @@
<?php

use Tests\Funcional\Sei\Fixtures\{ProtocoloFixture,ProcedimentoFixture,AtividadeFixture,ContatoFixture};
use Tests\Funcional\Sei\Fixtures\{ParticipanteFixture,RelProtocoloAssuntoFixture,AtributoAndamentoFixture};
use Tests\Funcional\Sei\Fixtures\{DocumentoFixture,AssinaturaFixture,AnexoFixture,AnexoProcessoFixture};

/**
* Classe base contendo rotinas comuns utilizadas nos casos de teste do módulo que utiliza fixture
*/
class FixtureCenarioBaseTestCase extends CenarioBaseTestCase
{
protected function cadastrarProcessoFixture(&$dadosProcesso)
{
$parametros = [
'Descricao' => $dadosProcesso['DESCRICAO'],
'Interessados' => $dadosProcesso['INTERESSADOS'],
];
$objProtocoloFixture = new ProtocoloFixture();
$objProtocoloDTO = $objProtocoloFixture->carregar($parametros);
$objProcedimentoFixture = new ProcedimentoFixture();

$objProcedimentoDTO = $objProcedimentoFixture->carregar([
'IdProtocolo' => $objProtocoloDTO->getDblIdProtocolo()
]);

$objAtividadeFixture = new AtividadeFixture();
$objAtividadeDTO = $objAtividadeFixture->carregar([
'IdProtocolo' => $objProtocoloDTO->getDblIdProtocolo(),
'Conclusao' => \InfraData::getStrDataHoraAtual(),
'IdTarefa' => \TarefaRN::$TI_GERACAO_PROCEDIMENTO,
'IdUsuarioConclusao' => 100000001
]);

$objContatoFixture = new ContatoFixture();
$objContatoDTO = $objContatoFixture->carregar([
'Nome' => $parametros['Interessados']
]);

$objParticipanteFixture = new ParticipanteFixture();
$objParticipanteDTO = $objParticipanteFixture->carregar([
'IdProtocolo' => $objProtocoloDTO->getDblIdProtocolo(),
'IdContato' => $objContatoDTO->getNumIdContato()
]);

$objProtocoloAssuntoFixture = new RelProtocoloAssuntoFixture();
$objProtocoloAssuntoFixture->carregar([
'IdProtocolo' => $objProtocoloDTO->getDblIdProtocolo()
]);

$objAtributoAndamentoFixture = new AtributoAndamentoFixture();
$objAtributoAndamentoFixture->carregar([
'IdAtividade' => $objAtividadeDTO->getNumIdAtividade()
]);

$dadosProcesso['PROTOCOLO'] = $protocoloGerado;

return $objProtocoloDTO;
}

protected function cadastrarDocumentoInternoFixture($dadosDocumentoInterno, $idProtocolo)
{
$objDocumentoFixture = new DocumentoFixture();
$objDocumentoDTO = $objDocumentoFixture->carregar([
'IdProtocolo' => $idProtocolo,
'IdProcedimento' => $idProtocolo,
'Descricao' => $dadosDocumentoInterno['DESCRICAO'],
]);

//Adicionar assinatura ao documento
$objAssinaturaFixture = new AssinaturaFixture();
$objAssinaturaFixture->carregar([
'IdProtocolo' => $idProtocolo,
'IdDocumento' => $objDocumentoDTO->getDblIdDocumento(),
]);

}

protected function cadastrarDocumentoExternoFixture($dadosDocumentoExterno, $idProtocolo)
{
$objDocumentoFixture = new DocumentoFixture();
$objDocumentoDTO = $objDocumentoFixture->carregar([
'IdProtocolo' => $idProtocolo,
'IdProcedimento' => $idProtocolo,
'Descricao' => $dadosDocumentoExterno['DESCRICAO'],
'StaProtocolo' => \ProtocoloRN::$TP_DOCUMENTO_RECEBIDO,
'StaDocumento' => \DocumentoRN::$TD_EXTERNO,
'IdConjuntoEstilos' => NULL,
]);

//Adicionar anexo ao documento
$objAnexoFixture = new AnexoFixture();
$objAnexoFixture->carregar([
'IdProtocolo' => $objDocumentoDTO->getDblIdDocumento(),
'Nome' => basename($dadosDocumentoExterno['ARQUIVO']),
]);

}

protected function anexarProcessoFixture($protocoloPrincipalId, $protocoloProcessoAnexadoId)
{
// Realizar a anexação de processos
$objAnexoProcessoFixture = new AnexoProcessoFixture();
$objAnexoProcessoFixture->carregar([
'IdProtocolo' => $protocoloPrincipalId,
'IdDocumento' => $protocoloProcessoAnexadoId,
]);
}

protected function realizarTramiteExternoFixture(&$processoTeste, $documentosTeste, $remetente, $destinatario, $validarTramite)
{
$orgaosDiferentes = $remetente['URL'] != $destinatario['URL'];

$buscar = false;
// 1 - Cadastrar novo processo de teste
if (isset($processoTeste['PROTOCOLO'])) {
$strProtocoloTeste = $processoTeste['PROTOCOLO'];

$parametros = [
'ProtocoloFormatado' => $strProtocoloTeste,
];
$objProtocoloFixture = new ProtocoloFixture();
$objProtocoloDTO = $objProtocoloFixture->buscar($parametros)[0];

} else {
$objProtocoloDTO = $this->cadastrarProcessoFixture($processoTeste);
$strProtocoloTeste = $objProtocoloDTO->getStrProtocoloFormatado();
$processoTeste['PROTOCOLO'] = $strProtocoloTeste;
}

// 2 - Incluir Documentos no Processo
$documentosTeste = array_key_exists('TIPO', $documentosTeste) ? array($documentosTeste) : $documentosTeste;
foreach ($documentosTeste as $doc) {
if ($doc['TIPO'] == 'G') {
// cadastra e assina documento interno
$this->cadastrarDocumentoInternoFixture($doc,$objProtocoloDTO->getDblIdProtocolo());
} else if ($doc['TIPO'] == 'R') {
$this->cadastrarDocumentoExternoFixture($doc, $objProtocoloDTO->getDblIdProtocolo());
}
}

// 3 - Acessar sistema do REMETENTE do processo
$this->acessarSistema($remetente['URL'], $remetente['SIGLA_UNIDADE'], $remetente['LOGIN'], $remetente['SENHA']);

// 4 - Abrir processo
$this->abrirProcesso($strProtocoloTeste);

// 5 - Trâmitar Externamento processo para órgão/unidade destinatária
$paginaTramitar = $this->paginaTramitar;
$this->tramitarProcessoExternamente($strProtocoloTeste, $destinatario['REP_ESTRUTURAS'], $destinatario['NOME_UNIDADE'], $destinatario['SIGLA_UNIDADE_HIERARQUIA'], false);

if ($validarTramite) {
// 6 - Verificar se situação atual do processo está como bloqueado
$this->waitUntil(function ($testCase) use (&$orgaosDiferentes) {
sleep(5);
$this->atualizarTramitesPEN();
$testCase->refresh();
$paginaProcesso = new PaginaProcesso($testCase);
$testCase->assertStringNotContainsString(utf8_encode("Processo em trâmite externo para "), $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($destinatario['NOME_UNIDADE'], "ISO-8859-1");
$mensagemRecibo = sprintf("Trâmite externo do Processo %s para %s", $strProtocoloTeste, $unidade);
$this->validarRecibosTramite($mensagemRecibo, true, true);

// 8 - Validar histórico de trâmite do processo
$this->validarHistoricoTramite(self::$nomeUnidadeDestinatario, true, true);

// 9 - Verificar se processo está na lista de Processos Tramitados Externamente
$deveExistir = $remetente['URL'] != $destinatario['URL'];
$this->validarProcessosTramitados($strProtocoloTeste, $deveExistir);
}
}

public function realizarTramiteExternoComValidacaoNoRemetenteFixture(&$processoTeste, $documentosTeste, $remetente, $destinatario)
{
$this->realizarTramiteExternoFixture($processoTeste, $documentosTeste, $remetente, $destinatario, true);
}

public function realizarTramiteExternoSemvalidacaoNoRemetenteFixture(&$processoTeste, $documentosTeste, $remetente, $destinatario)
{
$this->realizarTramiteExternoFixture($processoTeste, $documentosTeste, $remetente, $destinatario, false);
}

}
Loading
Loading