Skip to content

Commit

Permalink
Atualização na maneira de salvar e recuperar documentos tramitados
Browse files Browse the repository at this point in the history
Cria o conceito de cópias imutáveis no filesystem que serão salvas e carregadas nos trâmites.

Closes #189
  • Loading branch information
fe-neto committed Nov 19, 2022
1 parent 4ac7b09 commit d8927bb
Show file tree
Hide file tree
Showing 15 changed files with 265 additions and 17 deletions.
12 changes: 11 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@


# Parâmetros de execução do comando MAKE
versao_sei=4
versao_sei=3
teste=

MODULO_NOME = pen
Expand Down Expand Up @@ -106,6 +106,7 @@ down:
# make teste=TramiteProcessoComDevolucaoTest test-functional
test-functional:
docker-compose -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env run --rm php-test-functional /tests/vendor/bin/phpunit -c /tests/phpunit.xml /tests/tests/$(addsuffix .php,$(teste))
# docker-compose -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env run --rm php-test-functional /tests/vendor/bin/phpunit -c /tests/phpunit.xml --stop-on-failure /tests/tests/$(addsuffix .php,$(teste))


test-functional-parallel:
Expand Down Expand Up @@ -164,6 +165,15 @@ tramitar-pendencias-silent:
i=$$((i + 1));\
done

update: ## Atualiza banco de dados através dos scripts de atualização do sistema
docker-compose -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env run --rm -w /opt/sei/scripts/ org1-http bash -c "$(CMD_INSTALACAO_SEI)"; true
docker-compose -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env run --rm -w /opt/sip/scripts/ org1-http bash -c "$(CMD_INSTALACAO_SIP)"; true
docker-compose -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env run --rm -w /opt/sip/scripts/ org1-http bash -c "$(CMD_INSTALACAO_RECURSOS_SEI)"; true
docker-compose -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env run --rm -w /opt/sei/scripts/ org2-http bash -c "$(CMD_INSTALACAO_SEI)"; true
docker-compose -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env run --rm -w /opt/sip/scripts/ org2-http bash -c "$(CMD_INSTALACAO_RECURSOS_SEI)"; true
docker-compose -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env run --rm -w /opt/sip/scripts/ org2-http bash -c "$(CMD_INSTALACAO_SIP)"; true


#deve ser rodado em outro terminal
stop-test-container:
docker stop $$(docker ps -a -q --filter="name=php-test")
Expand Down
60 changes: 60 additions & 0 deletions docs/changelogs/CHANGELOG-3.2.0.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
# NOTAS DE VERSÃO MOD-SEI-PEN (versão 3.2.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 realizada em versões anteriores.

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

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.


#### Atualização na maneira de salvar e recuperar documentos tramitados (#189)

Atualização na maneira que o módulo grava e recupera os arquivos que serão tramitados pelo barramento. Será criara uma cópia no Filesystem no momento do trâmite de cada documento, que será recuperada nos futuros envios. Dessa maneira as eventuais mudanças em tarjas e nomes de orgãos não criarão problemas de hash.


### 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
```
2 changes: 1 addition & 1 deletion src/PENIntegracao.php
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?php

// Identificação da versão do módulo. Este deverá ser atualizado e sincronizado com constante VERSAO_MODULO
define("VERSAO_MODULO_PEN", "3.1.22");
define("VERSAO_MODULO_PEN", "3.2.0");


class PENIntegracao extends SeiIntegracao
Expand Down
6 changes: 4 additions & 2 deletions src/dto/ComponenteDigitalDTO.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ public function montar() {
$this->adicionarAtributoTabela(InfraDTO::$PREFIXO_NUM, 'OrdemDocumentoReferenciado', 'ordem_documento_referenciado');
$this->adicionarAtributoTabela(InfraDTO::$PREFIXO_NUM, 'OrdemDocumentoAnexado', 'ordem_documento_anexado');
$this->adicionarAtributoTabela(InfraDTO::$PREFIXO_STR, 'SinEnviar', 'sin_enviar');
$this->adicionarAtributoTabela(InfraDTO::$PREFIXO_DBL, 'IdAnexoImutavel', 'id_anexo_imutavel');
$this->adicionarAtributoTabela(InfraDTO::$PREFIXO_STR, 'TarjaLegada', 'tarja_legada');

$this->adicionarAtributoTabelaRelacionada(InfraDTO::$PREFIXO_STR, 'StaTipoTramite', 'sta_tipo_tramite', 'md_pen_tramite');
$this->adicionarAtributoTabelaRelacionada(InfraDTO::$PREFIXO_NUM, 'TicketEnvioComponentes', 'ticket_envio_componentes', 'md_pen_tramite');
Expand All @@ -41,9 +43,9 @@ public function montar() {


$this->configurarPK('NumeroRegistro', InfraDTO::$TIPO_PK_INFORMADO);
// $this->configurarPK('IdProcedimento', InfraDTO::$TIPO_PK_INFORMADO);
$this->configurarPK('IdProcedimento', InfraDTO::$TIPO_PK_INFORMADO);
$this->configurarPK('IdDocumento', InfraDTO::$TIPO_PK_INFORMADO);
// $this->configurarPK('IdTramite', InfraDTO::$TIPO_PK_INFORMADO);
$this->configurarPK('IdTramite', InfraDTO::$TIPO_PK_INFORMADO);

$this->configurarFK('NumeroRegistro', 'md_pen_tramite', 'numero_registro', InfraDTO::$TIPO_FK_OBRIGATORIA);
$this->configurarFK('IdTramite', 'md_pen_tramite', 'id_tramite', InfraDTO::$TIPO_FK_OBRIGATORIA);
Expand Down
126 changes: 126 additions & 0 deletions src/rn/ExpedirProcedimentoRN.php
Original file line number Diff line number Diff line change
Expand Up @@ -1327,6 +1327,30 @@ private function obterDadosArquivo(DocumentoDTO $objDocumentoDTO, $paramStrStaAs
$strConteudoAssinatura = $this->obterConteudoInternoAssinatura($objDocumentoDTO, true, true);
}


$arrComponenteDigital=$this->retornaComponentesImutaveis($objDocumentoDTO);

if(!empty($arrComponenteDigital)){


$objAnexoRN = new AnexoRN();
$objAnexoDTO = new AnexoDTO();
$objAnexoDTO->setNumIdAnexo($arrComponenteDigital[0]->getDblIdAnexoImutavel());
$objAnexoDTO->setStrSinAtivo("S");
$objAnexoDTO->retTodos();

$objAnexoDTO=$objAnexoRN->consultarRN0736($objAnexoDTO);
$strConteudoFS=file_get_contents($objAnexoRN->obterLocalizacao($objAnexoDTO));

$hashDoComponenteDigital = base64_encode(hash(self::ALGORITMO_HASH_DOCUMENTO, $strConteudoFS, true));

if(isset($hashDoComponenteDigitalAnterior) && $hashDoComponenteDigital == $hashDoComponenteDigitalAnterior){
$strConteudoAssinatura=$strConteudoFS;
}

}


$objInformacaoArquivo['NOME'] = $strProtocoloDocumentoFormatado . ".html";
$objInformacaoArquivo['CONTEUDO'] = $strConteudoAssinatura;
$objInformacaoArquivo['TAMANHO'] = strlen($strConteudoAssinatura);
Expand Down Expand Up @@ -2035,6 +2059,15 @@ private function enviarComponentesDigitais($strNumeroRegistro, $numIdTramite, $s
}
} else {
$objDadosArquivo = $this->obterDadosArquivo($objDocumentoDTO, $strStaAssociacao);
$dados=[
"objDocumentoDTO"=>$objDocumentoDTO,
"objDadosArquivo"=>$objDadosArquivo,
"dadosDoComponenteDigital"=>$dadosDoComponenteDigital,
"idProcedimentoPrincipal"=>$objComponenteDigitalDTO->getDblIdProcedimento()

];

$this->salvarAnexoImutavel($dados);
$dadosDoComponenteDigital->conteudoDoComponenteDigital = new SoapVar($objDadosArquivo['CONTEUDO'], XSD_BASE64BINARY);

$parametros = new stdClass();
Expand Down Expand Up @@ -2066,6 +2099,99 @@ private function enviarComponentesDigitais($strNumeroRegistro, $numIdTramite, $s
}
}


protected function retornaComponentesImutaveisControlado($objDocumentoDTO){

$objComponenteDigitalDTO = new ComponenteDigitalDTO();
$objComponenteDigitalDTO->setDblIdDocumento($objDocumentoDTO->getDblIdDocumento());
$objComponenteDigitalDTO->setDblIdAnexoImutavel(null, InfraDTO::$OPER_DIFERENTE);
$objComponenteDigitalDTO->setStrTarjaLegada("N");
$objComponenteDigitalDTO->retTodos();

$objComponenteDigitalBD = new ComponenteDigitalBD($this->getObjInfraIBanco());
$arrComponenteDigital=$objComponenteDigitalBD->listar($objComponenteDigitalDTO);

return $arrComponenteDigital;


}


protected function salvarAnexoImutavelControlado($dados){

try{

$objDocumentoDTO=$dados["objDocumentoDTO"];
$objDadosArquivo=$dados["objDadosArquivo"];
$dadosDoComponenteDigital=$dados["dadosDoComponenteDigital"];
$idProcedimentoPrincipal=$dados["idProcedimentoPrincipal"];


$arrComponenteDigital=$this->retornaComponentesImutaveis($objDocumentoDTO);

if(empty($arrComponenteDigital)){

$objAnexoRN = new AnexoRN();

$strConteudoAssinatura=$objDadosArquivo['CONTEUDO'];
$strNomeArquivoUploadHtml = $objAnexoRN->gerarNomeArquivoTemporario();

if (file_put_contents(DIR_SEI_TEMP.'/'.$strNomeArquivoUploadHtml, $strConteudoAssinatura) === false) {
throw new InfraException('Erro criando arquivo html temporário para envio do e-mail.');
}


$objAnexoDTO = new AnexoDTO();
$objAnexoDTO->setNumIdAnexo($strNomeArquivoUploadHtml);
$objAnexoDTO->setDblIdProtocolo($objDocumentoDTO->getDblIdDocumento());
$objAnexoDTO->setDthInclusao(InfraData::getStrDataHoraAtual());
$objAnexoDTO->setNumTamanho(filesize(DIR_SEI_TEMP.'/'.$strNomeArquivoUploadHtml));
$objAnexoDTO->setNumIdUsuario(SessaoSEI::getInstance()->getNumIdUsuario());
$objAnexoDTO->setStrNome($objDocumentoDTO->getStrProtocoloDocumentoFormatado() . ".html");
$objAnexoDTO->setNumIdUnidade($objDocumentoDTO->getNumIdUnidadeResponsavel());
$objAnexoDTO->setStrSinAtivo("S");


$objAnexoDTO=$objAnexoRN->cadastrarRN0172($objAnexoDTO);


$objProcessoEletronicoDTO = new ProcessoEletronicoDTO();
// $objProcessoEletronicoDTO->setDblIdProcedimento($objDocumentoDTO->getDblIdProcedimento());
$objProcessoEletronicoDTO->setDblIdProcedimento($idProcedimentoPrincipal);

$objTramiteBD = new TramiteBD($this->getObjInfraIBanco());
$objTramiteDTO=$objTramiteBD->consultarUltimoTramite($objProcessoEletronicoDTO, ProcessoEletronicoRN::$STA_TIPO_TRAMITE_ENVIO);



$objComponenteDigitalDTO = new ComponenteDigitalDTO();
$objComponenteDigitalDTO->setDblIdDocumento($objDocumentoDTO->getDblIdDocumento());
$objComponenteDigitalDTO->setNumIdTramite($objTramiteDTO->getNumIdTramite());
$objComponenteDigitalDTO->retTodos();


$objComponenteDigitalBD = new ComponenteDigitalBD($this->getObjInfraIBanco());
$objComponenteDigitalDTO=$objComponenteDigitalBD->consultar($objComponenteDigitalDTO);

$objComponenteDigitalDTO->setDblIdAnexoImutavel($objAnexoDTO->getNumIdAnexo());
$objComponenteDigitalDTO->setDblIdProcedimento($objComponenteDigitalDTO->getDblIdProcedimento());
$objComponenteDigitalDTO->setStrNumeroRegistro($objComponenteDigitalDTO->getStrNumeroRegistro());
$objComponenteDigitalDTO=$objComponenteDigitalBD->alterar($objComponenteDigitalDTO);




}


}catch(Exception $e){
throw new InfraException("Erro salvando anexo imutável", $e);
}

}



private function corrigirNumeroOrdemComponentes($arrComponentesDigitaisDTO, $strProtocoloDocumento) {
$arrOrdensComponentes = InfraArray::converterArrInfraDTO($arrComponentesDigitaisDTO, "Ordem");
if(min($arrOrdensComponentes) <= 0){
Expand Down
1 change: 1 addition & 0 deletions src/rn/ProcessoEletronicoRN.php
Original file line number Diff line number Diff line change
Expand Up @@ -1013,6 +1013,7 @@ protected function cadastrarTramiteDeProcessoInternoControlado(ProcessoEletronic
$objComponenteDigitalDTOFiltro->setNumOrdemDocumento($objComponenteDigitalDTO->getNumOrdemDocumento());

if($objComponenteDigitalBD->contar($objComponenteDigitalDTOFiltro) == 0){
$objComponenteDigitalDTO->setStrTarjaLegada("N");
$objComponenteDigitalDTO = $objComponenteDigitalBD->cadastrar($objComponenteDigitalDTO);
}
else {
Expand Down
2 changes: 1 addition & 1 deletion src/rn/ReceberComponenteDigitalRN.php
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ private function atualizarAnexoDoComponenteDigital($parObjComponenteDigitalDTO,
$objComponenteDigitalDTO->setNumIdTramite($parObjComponenteDigitalDTO->getNumIdTramite());
$objComponenteDigitalDTO->setStrNumeroRegistro($parObjComponenteDigitalDTO->getStrNumeroRegistro());
$objComponenteDigitalDTO->setDblIdDocumento($parObjComponenteDigitalDTO->getDblIdDocumento());
//$objComponenteDigitalDTO->setDblIdProcedimento($parObjComponenteDigitalDTO->getDblIdProcedimento());
$objComponenteDigitalDTO->setDblIdProcedimento($parObjComponenteDigitalDTO->getDblIdProcedimento());
//$objComponenteDigitalDTO->setNumOrdem($parObjComponenteDigitalDTO->getNumOrdem());
$objComponenteDigitalDTO->setNumIdAnexo($parObjAnexoDTO->getNumIdAnexo());
$objComponenteDigitalBD = new ComponenteDigitalBD($this->getObjInfraIBanco());
Expand Down
16 changes: 16 additions & 0 deletions src/scripts/sei_atualizar_versao_modulo_pen.php
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,8 @@ protected function atualizarVersaoConectado()
$this->instalarV30121();
case '3.1.21':
$this->instalarV30122();
case '3.1.22':
$this->instalarV3020();
break;
default:
$this->finalizar('VERSAO DO MÓDULO JÁ CONSTA COMO ATUALIZADA');
Expand Down Expand Up @@ -2467,6 +2469,20 @@ protected function instalarV30122()
$objMetaBanco->renomearTabela("md_pen_rel_expedir_lote_procedimento", "md_pen_rel_expedir_lote");
$this->atualizarNumeroVersao("3.1.22");
}

protected function instalarV3020()
{

$this->atualizarNumeroVersao("3.2.0");

$objInfraMetaBD = new InfraMetaBD(BancoSEI::getInstance());

$objInfraMetaBD->adicionarColuna('md_pen_componente_digital', 'id_anexo_imutavel', $objInfraMetaBD->tipoNumeroGrande(), 'null');
$objInfraMetaBD->adicionarColuna('md_pen_componente_digital', 'tarja_legada', $objInfraMetaBD->tipoTextoFixo(1), 'null');

BancoSEI::getInstance()->executarSql("update md_pen_componente_digital set tarja_legada='S'");

}
}


Expand Down
8 changes: 7 additions & 1 deletion src/scripts/sip_atualizar_versao_modulo_pen.php
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?php

// Identificação da versão do módulo mod-sei-pen. Este deve estar sempre sincronizado com a versão definida em PENIntegracao.php
define("VERSAO_MODULO_PEN", "3.1.22");
define("VERSAO_MODULO_PEN", "3.2.0");

$dirSipWeb = !defined("DIR_SIP_WEB") ? getenv("DIR_SIP_WEB") ?: __DIR__ . "/../../web" : DIR_SIP_WEB;
require_once $dirSipWeb . '/Sip.php';
Expand Down Expand Up @@ -270,6 +270,8 @@ protected function atualizarVersaoConectado()
$this->instalarV30121();
case '3.1.21':
$this->instalarV30122();
case '3.1.22':
$this->instalarV3020();
// Ausência de [break;] proposital para realizar a atualização incremental de versões
break;

Expand Down Expand Up @@ -1770,6 +1772,10 @@ protected function instalarV30122()
{
$this->atualizarNumeroVersao("3.1.22");
}
protected function instalarV3020()
{
$this->atualizarNumeroVersao("3.2.0");
}
}

/**
Expand Down
2 changes: 1 addition & 1 deletion tests_sei3/funcional/.env_oracle
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
SEI_PATH=../../../../../../

SEI_DATABASE_NAME=sei
SEI_DATABASE_USER=sei_user
SEI_DATABASE_USER=sei
SEI_DATABASE_PASSWORD=sei_user


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,12 @@ public function test_tramitar_processo_da_origem()
$bancoOrgaoA = new DatabaseUtils(CONTEXTO_ORGAO_A);
$id_tramite = $bancoOrgaoA->query("select max(id_tramite) as id_tramite from sei.md_pen_componente_digital where protocolo = ?", array(self::$protocoloTeste));
//recusa o tramite contendo justificativa grande
$this->recusarTramite($this->servicoPEN, $id_tramite[0]["id_tramite"]);
if (array_key_exists("id_tramite", $id_tramite[0])) {
$id_tramite=$id_tramite[0]["id_tramite"];
}else{
$id_tramite=$id_tramite[0]["ID_TRAMITE"];
}
$this->recusarTramite($this->servicoPEN, $id_tramite);
}

/**
Expand Down
10 changes: 8 additions & 2 deletions tests_sei3/funcional/tests/TramiteProcessoComHistoricoTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,14 @@ public function test_verificar_destino_processo_para_devolucao()
inner join sei.md_pen_tramite tra on pen.numero_registro=tra.numero_registro
where protocolo_formatado=?",array(self::$protocoloTeste));

if (array_key_exists("id_tramite", $idtEnviado[0])) {
$idtEnviado=$idtEnviado[0]["id_tramite"];
}else{
$idtEnviado=$idtEnviado[0]["ID_TRAMITE"];
}

$curl_handler = curl_init();
curl_setopt($curl_handler, CURLOPT_URL, "https://homolog.api.processoeletronico.gov.br/interoperabilidade/rest/v2/tramites/" . $idtEnviado[0]["id_tramite"]);
curl_setopt($curl_handler, CURLOPT_URL, "https://homolog.api.processoeletronico.gov.br/interoperabilidade/rest/v2/tramites/" . $idtEnviado);
curl_setopt($curl_handler, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_handler, CURLOPT_FAILONERROR, true);
curl_setopt($curl_handler, CURLOPT_SSLCERT, $localCertificado);
Expand Down Expand Up @@ -110,7 +116,7 @@ public function test_verificar_destino_processo_para_devolucao()
// return ($a->dataHoraOperacao < $b->dataHoraOperacao? -1: 1);
// });

$this->assertEquals(5, sizeof($saida->processo->itensHistorico) );
$this->assertEquals(9, sizeof($saida->processo->itensHistorico) );



Expand Down
Loading

0 comments on commit d8927bb

Please sign in to comment.