Commit 2eb81e78413d9284687a899fc5045014ee4c8652

Authored by Eduardo Heinske
1 parent b81fc219

Scripts de atualização do banco de dados

sei_atualizar_versao_modulo_pen.php 0 → 100644
... ... @@ -0,0 +1,70 @@
  1 +<?php
  2 +/**
  3 + * Script para atualizaçăo do sistema SEI.
  4 + *
  5 + * Modificar o "short_open_tag" para "On" no php.ini
  6 + *
  7 + * PHP 5.3.3 (cli) (built: Jul 9 2015 17:39:00)
  8 + * Copyright (c) 1997-2010 The PHP Group
  9 + * Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
  10 + *
  11 + * @author Join Tecnologia
  12 + */
  13 +
  14 +try {
  15 +
  16 + require_once dirname(__FILE__).'/../web/SEI.php';
  17 +
  18 + $objPenConsoleRN = new PenConsoleRN();
  19 + $arrArgs = $objPenConsoleRN->getTokens();
  20 +
  21 + $objAtualizarRN = new PenAtualizarSeiRN($arrArgs);
  22 + $objAtualizarRN->atualizarVersao();
  23 +
  24 + exit(0);
  25 +}
  26 +catch(InfraException $e){
  27 +
  28 + print $e->getStrDescricao().PHP_EOL;
  29 +}
  30 +catch(Exception $e) {
  31 +
  32 + print InfraException::inspecionar($e);
  33 +
  34 + try {
  35 + LogSEI::getInstance()->gravar(InfraException::inspecionar($e));
  36 + } catch (Exception $e) {
  37 +
  38 + }
  39 +
  40 + exit(1);
  41 +}
  42 +
  43 +print PHP_EOL;
  44 +
  45 +/**
  46 + # Apagar modulo PEN no SEI pelo MySQL
  47 +
  48 + SET FOREIGN_KEY_CHECKS = 0;
  49 + DROP TABLE `sei`.`pen_componente_digital`;
  50 + DROP TABLE `sei`.`pen_envio_recebimento_tramite`;
  51 + DROP TABLE `sei`.`pen_especie_documental`;
  52 + DROP TABLE `sei`.`pen_procedimento_andamento`;
  53 + DROP TABLE `sei`.`pen_procedimento_expedir_andamento`;
  54 + DROP TABLE `sei`.`pen_processo_eletronico`;
  55 + DROP TABLE `sei`.`pen_protocolo`;
  56 + DROP TABLE `sei`.`pen_receber_tramites_recusados`;
  57 + DROP TABLE `sei`.`pen_recibo_tramite`;
  58 + DROP TABLE `sei`.`pen_recibo_tramite_enviado`;
  59 + DROP TABLE `sei`.`pen_recibo_tramite_recebido`;
  60 + DROP TABLE `sei`.`pen_rel_processo_apensado`;
  61 + DROP TABLE `sei`.`pen_rel_serie_especie`;
  62 + DROP TABLE `sei`.`pen_rel_tarefa_operacao`;
  63 + DROP TABLE `sei`.`pen_rel_tipo_documento_mapeamento_recebido`;
  64 + DROP TABLE `sei`.`pen_tramite`;
  65 + DROP TABLE `sei`.`pen_tramite_pendente`;
  66 + ALTER TABLE unidade DROP COLUMN id_unidade_rh;
  67 + SET FOREIGN_KEY_CHECKS = 1;
  68 +
  69 +
  70 + */
0 71 \ No newline at end of file
... ...
sip_atualizar_versao_modulo_pen.php 0 → 100644
... ... @@ -0,0 +1,1258 @@
  1 +<?php
  2 +require_once dirname(__FILE__).'/../web/Sip.php';
  3 +
  4 +set_include_path(implode(PATH_SEPARATOR, array(
  5 + realpath(__DIR__ . '/../../infra/infra_php'),
  6 + get_include_path(),
  7 +)));
  8 +
  9 +
  10 +/**
  11 + * Mapeamento dos metadados sobre a estrutura do banco de dados
  12 + *
  13 + * @author Join Tecnologia
  14 + */
  15 +class PenMetaBD extends InfraMetaBD {
  16 +
  17 + const NNULLO = 'NOT NULL';
  18 + const SNULLO = 'NULL';
  19 +
  20 + /**
  21 + *
  22 + * @return string
  23 + */
  24 + public function adicionarValorPadraoParaColuna($strNomeTabela, $strNomeColuna, $strValorPadrao, $bolRetornarQuery = false){
  25 +
  26 + $objInfraBanco = $this->getObjInfraIBanco();
  27 +
  28 + $strTableDrive = get_parent_class($objInfraBanco);
  29 + $strQuery = '';
  30 +
  31 + switch($strTableDrive) {
  32 +
  33 + case 'InfraMySqli':
  34 + $strQuery = sprintf("ALTER TABLE `%s` ALTER COLUMN `%s` SET DEFAULT '%s'", $strNomeTabela, $strNomeColuna, $strValorPadrao);
  35 + break;
  36 +
  37 + case 'InfraSqlServer':
  38 + $strQuery = sprintf("ALTER TABLE [%s] ADD DEFAULT('%s') FOR [%s]", $strNomeTabela, $strValorPadrao, $strNomeColuna);
  39 +
  40 + case 'InfraOracle':
  41 + break;
  42 + }
  43 +
  44 + if($bolRetornarQuery === false) {
  45 +
  46 + $objInfraBanco->executarSql($strQuery);
  47 + }
  48 + else {
  49 +
  50 + return $strQuery;
  51 + }
  52 + }
  53 +
  54 + /**
  55 + * Verifica se o usuário do drive de conexão possui permissão para criar/ remover
  56 + * estruturas
  57 + *
  58 + * @return PenMetaBD
  59 + */
  60 + public function isDriverPermissao(){
  61 +
  62 + $objInfraBanco = $this->getObjInfraIBanco();
  63 +
  64 + if(count($this->obterTabelas('sei_teste'))==0){
  65 + $objInfraBanco->executarSql('CREATE TABLE sei_teste (id '.$this->tipoNumero().' NULL)');
  66 + }
  67 +
  68 + $objInfraBanco->executarSql('DROP TABLE sei_teste');
  69 +
  70 + return $this;
  71 + }
  72 +
  73 + /**
  74 + * Verifica se o banco do SEI é suportador pelo atualizador
  75 + *
  76 + * @throws InfraException
  77 + * @return PenMetaBD
  78 + */
  79 + public function isDriverSuportado(){
  80 +
  81 + $strTableDrive = get_parent_class($this->getObjInfraIBanco());
  82 +
  83 + switch($strTableDrive) {
  84 +
  85 + case 'InfraMySqli':
  86 + // Fix para bug de MySQL versão inferior ao 5.5 o default engine
  87 + // é MyISAM e não tem suporte a FOREING KEYS
  88 + $version = $this->getObjInfraIBanco()->consultarSql('SELECT VERSION() as versao');
  89 + $version = $version[0]['versao'];
  90 + $arrVersion = explode('.', $version);
  91 +
  92 + if($arrVersion[0].$arrVersion[1] < 56){
  93 + $this->getObjInfraIBanco()->executarSql('@SET STORAGE_ENGINE=InnoDB');
  94 + }
  95 + case 'InfraSqlServer':
  96 + case 'InfraOracle':
  97 + break;
  98 +
  99 + default:
  100 + throw new InfraException('BANCO DE DADOS NAO SUPORTADO: ' . $strTableDrive);
  101 +
  102 + }
  103 +
  104 + return $this;
  105 + }
  106 +
  107 + /**
  108 + * Verifica se a versão sistema é compativel com a versão do módulo PEN
  109 + *
  110 + * @throws InfraException
  111 + * @return PenMetaBD
  112 + */
  113 + public function isVersaoSuportada($strRegexVersaoSistema, $strVerMinRequirida){
  114 +
  115 + $numVersaoRequerida = intval(preg_replace('/\D+/', '', $strVerMinRequirida));
  116 + $numVersaoSistema = intval(preg_replace('/\D+/', '', $strRegexVersaoSistema));
  117 +
  118 + if($numVersaoRequerida > $numVersaoSistema){
  119 + throw new InfraException('VERSAO DO FRAMEWORK PHP INCOMPATIVEL (VERSAO ATUAL '.$strRegexVersaoSistema.', VERSAO REQUERIDA '.$strVerMinRequirida.')');
  120 + }
  121 +
  122 + return $this;
  123 + }
  124 +
  125 + /**
  126 + * Apaga a chave primária da tabela
  127 + *
  128 + * @throws InfraException
  129 + * @return PenMetaBD
  130 + */
  131 + public function removerChavePrimaria($strNomeTabela, $strNomeChave){
  132 +
  133 + if($this->isChaveExiste($strNomeTabela, $strNomeChave)) {
  134 +
  135 + $strTableDrive = get_parent_class($this->getObjInfraIBanco());
  136 +
  137 + switch($strTableDrive) {
  138 +
  139 + case 'InfraMySqli':
  140 + $this->getObjInfraIBanco()->executarSql('ALTER TABLE '.$strNomeTabela.' DROP PRIMARY KEY');
  141 + break;
  142 +
  143 + case 'InfraSqlServer':
  144 + $this->getObjInfraIBanco()->executarSql('ALTER TABLE '.$strNomeTabela.' DROP CONSTRAINT '.$strNomeChave);
  145 + break;
  146 +
  147 + case 'InfraOracle':
  148 + break;
  149 + }
  150 + }
  151 + return $this;
  152 + }
  153 +
  154 + public function isChaveExiste($strNomeTabela = '', $strNomeChave = ''){
  155 +
  156 + $objInfraBanco = $this->getObjInfraIBanco();
  157 + $strTableDrive = get_parent_class($objInfraBanco);
  158 +
  159 + switch($strTableDrive) {
  160 +
  161 + case 'InfraMySqli':
  162 + $strSql = " SELECT COUNT(CONSTRAINT_NAME) AS EXISTE
  163 + FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
  164 + WHERE CONSTRAINT_SCHEMA = '".$objInfraBanco->getBanco()."'
  165 + AND TABLE_NAME = '".$strNomeTabela."'
  166 + AND CONSTRAINT_NAME = '".$strNomeChave."'";
  167 + break;
  168 +
  169 + case 'InfraSqlServer':
  170 +
  171 + $strSql = " SELECT COUNT(CONSTRAINT_NAME) AS EXISTE
  172 + FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
  173 + WHERE CONSTRAINT_CATALOG = '".$objInfraBanco->getBanco()."'
  174 + AND TABLE_NAME = '".$strNomeTabela."'
  175 + AND CONSTRAINT_NAME = '".$strNomeChave."'";
  176 + break;
  177 +
  178 + case 'InfraOracle':
  179 + $strSql = "SELECT 0 AS EXISTE";
  180 + break;
  181 + }
  182 +
  183 + $strSql = preg_replace('/\s+/', ' ', $strSql);
  184 + $arrDados = $objInfraBanco->consultarSql($strSql);
  185 +
  186 + return (intval($arrDados[0]['EXISTE']) > 0) ? true : false;
  187 + }
  188 +
  189 + public function adicionarChaveUnica($strNomeTabela = '', $arrNomeChave = array()){
  190 +
  191 + $this->getObjInfraIBanco()
  192 + ->executarSql('ALTER TABLE '.$strNomeTabela.' ADD CONSTRAINT UK_'.$strNomeTabela.' UNIQUE('.implode(', ', $arrNomeChave).')');
  193 + }
  194 +
  195 + public function renomearTabela($strNomeTabelaAtual, $strNomeTabelaNovo){
  196 +
  197 + if($this->isTabelaExiste($strNomeTabelaAtual)) {
  198 +
  199 + $objInfraBanco = $this->getObjInfraIBanco();
  200 +
  201 + $strTableDrive = get_parent_class($objInfraBanco);
  202 + $strQuery = '';
  203 +
  204 + switch ($strTableDrive) {
  205 +
  206 + case 'InfraMySqli':
  207 + $strQuery = sprintf("ALTER TABLE `%s` RENAME TO `%s`", $strNomeTabelaAtual, $strNomeTabelaNovo);
  208 + break;
  209 +
  210 + case 'InfraSqlServer':
  211 + $strQuery = sprintf("sp_rename '%s', '%s'", $strNomeTabelaAtual, $strNomeTabelaNovo);
  212 +
  213 + case 'InfraOracle':
  214 + $strQuery = sprintf("RENAME TABLE %s TO %s", $strNomeTabelaAtual, $strNomeTabelaNovo);
  215 + break;
  216 + }
  217 +
  218 + $objInfraBanco->executarSql($strQuery);
  219 + }
  220 + }
  221 +
  222 +
  223 + /**
  224 + * Verifica se uma tabela existe no banco
  225 + *
  226 + * @throws InfraException
  227 + * @return bool
  228 + */
  229 + public function isTabelaExiste($strNomeTabela = ''){
  230 +
  231 + $objInfraBanco = $this->getObjInfraIBanco();
  232 + $strTableDrive = get_parent_class($objInfraBanco);
  233 +
  234 + switch($strTableDrive) {
  235 +
  236 + case 'InfraMySqli':
  237 + $strSql = "SELECT COUNT(TABLE_NAME) AS EXISTE
  238 + FROM INFORMATION_SCHEMA.TABLES
  239 + WHERE TABLE_SCHEMA = '".$objInfraBanco->getBanco()."'
  240 + AND TABLE_NAME = '".$strNomeTabela."'";
  241 + break;
  242 +
  243 + case 'InfraSqlServer':
  244 +
  245 + $strSql = "SELECT COUNT(TABLE_NAME) AS EXISTE
  246 + FROM INFORMATION_SCHEMA.TABLES
  247 + WHERE TABLE_CATALOG = '".$objInfraBanco->getBanco()."'
  248 + AND TABLE_NAME = '".$strNomeTabela."'";
  249 + break;
  250 +
  251 + case 'InfraOracle':
  252 + $strSql = "SELECT 0 AS EXISTE";
  253 + break;
  254 + }
  255 +
  256 + $strSql = preg_replace('/\s+/', ' ', $strSql);
  257 + $arrDados = $objInfraBanco->consultarSql($strSql);
  258 +
  259 + return (intval($arrDados[0]['EXISTE']) > 0) ? true : false;
  260 + }
  261 +
  262 + public function isColuna($strNomeTabela = '', $strNomeColuna = ''){
  263 +
  264 + $objInfraBanco = $this->getObjInfraIBanco();
  265 + $strTableDrive = get_parent_class($objInfraBanco);
  266 +
  267 + switch($strTableDrive) {
  268 +
  269 + case 'InfraMySqli':
  270 + $strSql = "SELECT COUNT(TABLE_NAME) AS EXISTE
  271 + FROM INFORMATION_SCHEMA.COLUMNS
  272 + WHERE TABLE_SCHEMA = '".$objInfraBanco->getBanco()."'
  273 + AND TABLE_NAME = '".$strNomeTabela."'
  274 + AND COLUMN_NAME = '".$strNomeColuna."'";
  275 + break;
  276 +
  277 + case 'InfraSqlServer':
  278 +
  279 + $strSql = "SELECT COUNT(COLUMN_NAME) AS EXISTE
  280 + FROM INFORMATION_SCHEMA.COLUMNS
  281 + WHERE TABLE_CATALOG = '".$objInfraBanco->getBanco()."'
  282 + AND TABLE_NAME = '".$strNomeTabela."'
  283 + AND COLUMN_NAME = '".$strNomeColuna."'";
  284 + break;
  285 +
  286 + case 'InfraOracle':
  287 + $strSql = "SELECT 0 AS EXISTE";
  288 + break;
  289 + }
  290 +
  291 + $strSql = preg_replace('/\s+/', ' ', $strSql);
  292 + $arrDados = $objInfraBanco->consultarSql($strSql);
  293 +
  294 + return (intval($arrDados[0]['EXISTE']) > 0) ? true : false;
  295 +
  296 +
  297 + }
  298 +
  299 + /**
  300 + * Cria a estrutura da tabela no padrão ANSI
  301 + *
  302 + * @throws InfraException
  303 + * @return PenMetaBD
  304 + */
  305 + public function criarTabela($arrSchema = array()){
  306 +
  307 + $strNomeTabela = $arrSchema['tabela'];
  308 +
  309 +
  310 + if($this->isTabelaExiste($strNomeTabela)) {
  311 + return $this;
  312 + }
  313 +
  314 + $objInfraBanco = $this->getObjInfraIBanco();
  315 + $arrColunas = array();
  316 + $arrStrQuery = array();
  317 +
  318 + foreach($arrSchema['cols'] as $strNomeColuna => $arrColunaConfig) {
  319 +
  320 + list($strTipoDado, $strValorPadrao) = $arrColunaConfig;
  321 +
  322 + if($strValorPadrao != self::SNULLO && $strValorPadrao != self::NNULLO) {
  323 +
  324 + $arrStrQuery[] = $this->adicionarValorPadraoParaColuna($strNomeTabela, $strNomeColuna, $strValorPadrao, true);
  325 + $strValorPadrao = self::NNULLO;
  326 + }
  327 +
  328 + $arrColunas[] = $strNomeColuna.' '.$strTipoDado.' '.$strValorPadrao;
  329 + }
  330 +
  331 + $objInfraBanco->executarSql('CREATE TABLE '.$strNomeTabela.' ('.implode(', ', $arrColunas).')');
  332 +
  333 + if(!empty($arrSchema['pk'])) {
  334 +
  335 + $this->adicionarChavePrimaria($strNomeTabela, 'pk_'.$strNomeTabela, $arrSchema['pk']);
  336 +
  337 + if(count($arrSchema['pk']) > 1) {
  338 +
  339 + foreach($arrSchema['pk'] as $strPk) {
  340 +
  341 + $objInfraBanco->executarSql('CREATE INDEX idx_'.$strNomeTabela.'_'.$strPk.' ON '.$strNomeTabela.'('.$strPk.')');
  342 + }
  343 + }
  344 + }
  345 +
  346 + if(array_key_exists('uk', $arrSchema) && !empty($arrSchema['uk'])) {
  347 +
  348 + $this->adicionarChaveUnica($strNomeTabela, $arrSchema['uk']);
  349 + }
  350 +
  351 + if(!empty($arrSchema['fks'])) {
  352 +
  353 + foreach($arrSchema['fks'] as $strTabelaOrigem => $array) {
  354 +
  355 + $strNomeFK = 'fk_'.$strNomeTabela.'_'.$strTabelaOrigem;
  356 + $arrCamposOrigem = (array)array_shift($array);
  357 + $arrCampos = $arrCamposOrigem;
  358 +
  359 + if(!empty($array)) {
  360 + $arrCampos = (array)array_shift($array);
  361 + }
  362 +
  363 + $this->adicionarChaveEstrangeira($strNomeFK, $strNomeTabela, $arrCampos, $strTabelaOrigem, $arrCamposOrigem);
  364 + }
  365 + }
  366 +
  367 + if(!empty($arrStrQuery)) {
  368 +
  369 + foreach($arrStrQuery as $strQuery) {
  370 + $objInfraBanco->executarSql($strQuery);
  371 + }
  372 + }
  373 +
  374 + return $this;
  375 + }
  376 +
  377 + /**
  378 + * Apagar a estrutura da tabela no banco de dados
  379 + *
  380 + * @throws InfraException
  381 + * @return PenMetaBD
  382 + */
  383 + public function removerTabela($strNomeTabela = ''){
  384 +
  385 + $this->getObjInfraIBanco()->executarSql('DROP TABLE '.$strNomeTabela);
  386 + return $this;
  387 + }
  388 +
  389 + public function adicionarChaveEstrangeira($strNomeFK, $strTabela, $arrCampos, $strTabelaOrigem, $arrCamposOrigem) {
  390 +
  391 + if(!$this->isChaveExiste($strTabela, $strNomeFK)) {
  392 + parent::adicionarChaveEstrangeira($strNomeFK, $strTabela, $arrCampos, $strTabelaOrigem, $arrCamposOrigem);
  393 + }
  394 + return $this;
  395 + }
  396 +
  397 + public function adicionarChavePrimaria($strTabela, $strNomePK, $arrCampos) {
  398 +
  399 + if(!$this->isChaveExiste($strTabela, $strNomePK)) {
  400 + parent::adicionarChavePrimaria($strTabela, $strNomePK, $arrCampos);
  401 + }
  402 + return $this;
  403 + }
  404 +
  405 + public function alterarColuna($strTabela, $strColuna, $strTipo, $strNull = '') {
  406 + parent::alterarColuna($strTabela, $strColuna, $strTipo, $strNull);
  407 + return $this;
  408 + }
  409 +
  410 + public function excluirIndice($strTabela, $strIndex) {
  411 + if($this->isChaveExiste($strTabela, $strFk)) {
  412 + parent::excluirIndice($strTabela, $strIndex);
  413 + }
  414 + return $this;
  415 + }
  416 +
  417 + public function excluirChaveEstrangeira($strTabela, $strFk) {
  418 + if($this->isChaveExiste($strTabela, $strFk)) {
  419 + parent::excluirChaveEstrangeira($strTabela, $strFk);
  420 + }
  421 + return $this;
  422 + }
  423 +}
  424 +
  425 +abstract class PenAtualizadorRN extends InfraRN {
  426 +
  427 + const VER_NONE = '0.0.0'; // Modulo não instalado
  428 + const VER_001 = '0.0.1';
  429 + const VER_002 = '0.0.2';
  430 + const VER_003 = '0.0.3';
  431 + const VER_004 = '0.0.4';
  432 + const VER_005 = '0.0.5';
  433 +
  434 + protected $sei_versao;
  435 +
  436 + /**
  437 + * @var string Versão mínima requirida pelo sistema para instalação do PEN
  438 + */
  439 + protected $versaoMinRequirida;
  440 +
  441 + /**
  442 + * @var InfraIBanco Instância da classe de persistência com o banco de dados
  443 + */
  444 + protected $objBanco;
  445 +
  446 + /**
  447 + * @var InfraMetaBD Instância do metadata do banco de dados
  448 + */
  449 + protected $objMeta;
  450 +
  451 + /**
  452 + * @var InfraDebug Instância do debuger
  453 + */
  454 + protected $objDebug;
  455 +
  456 + /**
  457 + * @var integer Tempo de execução do script
  458 + */
  459 + protected $numSeg = 0;
  460 +
  461 + /**
  462 + * @var array Argumentos passados por linha de comando ao script
  463 + */
  464 + protected $arrArgs = array();
  465 +
  466 + /**
  467 + * Inicia a conexão com o banco de dados
  468 + */
  469 + protected function inicializarObjMetaBanco() {
  470 + if (empty($this->objMeta)) {
  471 + $this->objMeta = new PenMetaBD($this->inicializarObjInfraIBanco());
  472 + }
  473 + return $this->objMeta;
  474 + }
  475 +
  476 + /**
  477 + * Adiciona uma mensagem ao output para o usuário
  478 + *
  479 + * @return null
  480 + */
  481 + protected function logar($strMsg) {
  482 + $this->objDebug->gravar($strMsg);
  483 + }
  484 +
  485 + /**
  486 + * Inicia o script criando um contator interno do tempo de execução
  487 + *
  488 + * @return null
  489 + */
  490 + protected function inicializar($strTitulo) {
  491 +
  492 + $this->numSeg = InfraUtil::verificarTempoProcessamento();
  493 +
  494 + $this->logar($strTitulo);
  495 + }
  496 +
  497 + /**
  498 + * Finaliza o script informando o tempo de execução.
  499 + *
  500 + * @return null
  501 + */
  502 + protected function finalizar() {
  503 +
  504 + $this->logar('TEMPO TOTAL DE EXECUCAO: ' . InfraUtil::verificarTempoProcessamento($this->numSeg) . ' s');
  505 +
  506 + $this->objDebug->setBolLigado(false);
  507 + $this->objDebug->setBolDebugInfra(false);
  508 + $this->objDebug->setBolEcho(false);
  509 +
  510 + print PHP_EOL;
  511 + die();
  512 + }
  513 +
  514 + /**
  515 + * Método criado em função de um bug com a InfraRN na linha 69, onde usamos
  516 + * uma instância do banco do SIP e a versão esta no banco SEI, essa verificação
  517 + * e lançamento de uma excessão pelos bancos terem nome diferentes tava o
  518 + * atualizado
  519 + *
  520 + * @todo Migrar para classe PenMetaBD
  521 + * @return null
  522 + */
  523 + protected function setVersao($strRegexVersao, $objInfraBanco = null) {
  524 +
  525 + InfraDebug::getInstance()->gravarInfra(sprintf('[%s->%s]', get_class($this), __FUNCTION__));
  526 +
  527 +
  528 + if ($this->getVersao($objInfraBanco)) {
  529 +
  530 + $sql = sprintf("UPDATE infra_parametro SET valor = '%s' WHERE nome = '%s'", $strRegexVersao, $this->sei_versao);
  531 + } else {
  532 +
  533 + $sql = sprintf("INSERT INTO infra_parametro(nome, valor) VALUES('%s', '%s')", $this->sei_versao, $strRegexVersao);
  534 + }
  535 +
  536 + if (empty($objInfraBanco)) {
  537 +
  538 + $objInfraBanco = $this->inicializarObjInfraIBanco();
  539 + }
  540 +
  541 + $objInfraBanco->executarSql($sql);
  542 +
  543 + return $strRegexVersao;
  544 + }
  545 +
  546 + /**
  547 + * Retorna a versão atual do modulo, se já foi instalado
  548 + *
  549 + * @todo Migrar para classe PenMetaBD
  550 + * @param InfraBanco $objInfraBanco Conexão com o banco SEI ou SIP
  551 + * @return string
  552 + */
  553 + protected function getVersao($objInfraBanco = null) {
  554 +
  555 + InfraDebug::getInstance()->gravarInfra(sprintf('[%s->%s]', get_class($this), __FUNCTION__));
  556 +
  557 + $sql = sprintf("SELECT valor FROM infra_parametro WHERE nome = '%s'", $this->sei_versao);
  558 +
  559 + if (empty($objInfraBanco)) {
  560 +
  561 + $objInfraBanco = $this->inicializarObjInfraIBanco();
  562 + }
  563 +
  564 + $arrResultado = $objInfraBanco->consultarSql($sql);
  565 +
  566 + if (empty($arrResultado)) {
  567 + return null;
  568 + }
  569 +
  570 + $arrLinha = current($arrResultado);
  571 +
  572 + return $arrLinha['valor'];
  573 + }
  574 +
  575 + /**
  576 + * Verifica se o número da versão é valido
  577 + *
  578 + * @param string $strVersao Versão a ser instalada
  579 + * @return bool
  580 + */
  581 + protected function isVersaoValida($strVersao = self::VER_NONE) {
  582 +
  583 + if (empty($strVersao)) {
  584 + return false;
  585 + }
  586 +
  587 + // Remove os caracteres não númericos
  588 + $strVersao = preg_replace('/\D+/', '', $strVersao);
  589 +
  590 + // Tem que no mínimo 3 digitos
  591 + if (strlen($strVersao) < 3) {
  592 + return false;
  593 + }
  594 +
  595 + return is_numeric($strVersao) ? true : false;
  596 + }
  597 +
  598 + /**
  599 + * Verifica se um paramêtro existe, caso sim retorna o seu valor, senão
  600 + * retorna o default especificado.
  601 + *
  602 + * @param string $strChave Nome do paramêtro
  603 + * @param string $strParam String a ser formatada com o valor do paramêtro
  604 + * @param string $strParamDefault String que retorna caso o valor do
  605 + * paramêtro não exista
  606 + * @param bool $bolAlgumFiltroUsado Ponteiro de controle para verificar se
  607 + * pelo menos um paramêtro foi encontrado
  608 + * @return string
  609 + */
  610 + private function getStrArg($strChave = '', $strParam = '', $strParamDefault = '', &$bolAlgumFiltroUsado) {
  611 +
  612 + if (array_key_exists($strChave, $this->arrArgs)) {
  613 + $bolAlgumFiltroUsado = true;
  614 + return sprintf($strParam, str_pad($this->arrArgs[$strChave], 3, '0', STR_PAD_LEFT));
  615 + }
  616 + return $strParamDefault;
  617 + }
  618 +
  619 + /**
  620 + * Retorna a última versão disponivel. Verifica as constantes que iniciam
  621 + * com VER_
  622 + */
  623 + private function getUltimaVersao() {
  624 +
  625 + $objReflection = new ReflectionClass(__CLASS__);
  626 + $arrVersao = array_flip(preg_grep('/^VER\_/', array_flip($objReflection->getConstants())));
  627 + sort($arrVersao);
  628 + return array_pop($arrVersao);
  629 + }
  630 +
  631 + /**
  632 + * Encontra os métodos com notação para instalar a versão selecionada
  633 + *
  634 + * @return string Número da versão
  635 + */
  636 + protected function executarControlado() {
  637 +
  638 + $this->inicializarObjMetaBanco()
  639 + ->isDriverSuportado()
  640 + ->isDriverPermissao();
  641 + //->isVersaoSuportada(SEI_VERSAO, $this->versaoMinRequirida);
  642 +
  643 + $arrMetodo = array();
  644 +
  645 + // Retorna a última versão disponibilizada pelo script. Sempre tenta atualizar
  646 + // para versão mais antiga
  647 + $strVersaoInstalar = $this->getUltimaVersao();
  648 +
  649 + //throw new InfraException($strVersaoInstalar);
  650 + $objInfraBanco = $this->inicializarObjInfraIBanco();
  651 + // Versão atual
  652 + $strPenVersao = $this->getVersao($objInfraBanco);
  653 + if (!$this->isVersaoValida($strPenVersao)) {
  654 + // Não instalado
  655 + $strPenVersao = $this->setVersao(self::VER_NONE, $objInfraBanco);
  656 + }
  657 +
  658 + $numPenVersao = substr($strPenVersao, -1);
  659 + $numVersaoInstalar = intval(substr($strVersaoInstalar, -1));
  660 +
  661 + $bolAlgumFiltroUsado = false;
  662 + $strRegexRelease = $this->getStrArg('release', '(R%s)', '(R[0-9]{1,3})?', $bolAlgumFiltroUsado);
  663 + $strRegexSprint = $this->getStrArg('sprint', '(S%s)', '(S[0-9]{1,3})?', $bolAlgumFiltroUsado);
  664 + $strRegexItem = $this->getStrArg('user-story', '(US%s)', '(US|IW[0-9]{1,3})?', $bolAlgumFiltroUsado);
  665 + $strRegexItem = $this->getStrArg('item-worker', '(IW%s)', $strRegexItem, $bolAlgumFiltroUsado);
  666 +
  667 + // Instalar todas atualizações
  668 + if ($bolAlgumFiltroUsado === false) {
  669 +
  670 + $strRegexVersao = sprintf('[%d-%d]', ($numPenVersao + 1), $numVersaoInstalar);
  671 + }
  672 + // Instalar somente a solicitada
  673 + else {
  674 + // Caso algum paramêtro seja adicionado não deve passar para próxima versão
  675 + $strVersaoInstalar = $strPenVersao;
  676 + $strRegexVersao = intval(substr($strPenVersao, -1) + 1);
  677 + }
  678 +
  679 + // instalarV[0-9]{1,2}[0-9](R[0-9]{1,3})?(S[0-9]{1,3})?(US|IW[0-9]{1,4})?
  680 + $strRegex = sprintf('/^instalarV[0-9][0-9]%s%s%s%s/i', $strRegexVersao, $strRegexRelease, $strRegexSprint, $strRegexItem
  681 + );
  682 +
  683 + // Tenta encontrar métodos que iniciem com instalar
  684 + $arrMetodo = (array) preg_grep($strRegex, get_class_methods($this));
  685 +
  686 + if (empty($arrMetodo)) {
  687 +
  688 + throw new InfraException(sprintf('NENHUMA ATUALIZACAO FOI ENCONTRADA SUPERIOR A VERSAO %s DO MODULO PEN', $strPenVersao));
  689 + } else {
  690 +
  691 + foreach ($arrMetodo as $strMetodo) {
  692 +
  693 + $this->{$strMetodo}();
  694 + }
  695 + }
  696 + $this->setVersao($strVersaoInstalar, $objInfraBanco);
  697 +
  698 + return $strVersaoInstalar;
  699 + }
  700 +
  701 + /**
  702 + * Método que inicia o processo
  703 + */
  704 + public function atualizarVersao() {
  705 +
  706 + $this->inicializar('INICIANDO ATUALIZACAO DO MODULO PEN NO SEI VERSAO ' . SIP_VERSAO);
  707 +
  708 + try {
  709 +
  710 + $strRegexVersao = $this->executar();
  711 + $this->logar('ATUALIZADA VERSAO: ' . $strRegexVersao);
  712 + } catch (InfraException $e) {
  713 +
  714 + $this->logar('Erro: ' . $e->getStrDescricao());
  715 + } catch (\Exception $e) {
  716 +
  717 + $this->logar('Erro: ' . $e->getMessage());
  718 + }
  719 +
  720 + $this->finalizar();
  721 + }
  722 +
  723 + /**
  724 + * Construtor
  725 + *
  726 + * @param array $arrArgs Argumentos enviados pelo script
  727 + */
  728 + public function __construct($arrArgs = array()) {
  729 +
  730 + ini_set('max_execution_time', '0');
  731 + ini_set('memory_limit', '-1');
  732 + @ini_set('zlib.output_compression', '0');
  733 + @ini_set('implicit_flush', '1');
  734 + ob_implicit_flush();
  735 +
  736 + $this->arrArgs = $arrArgs;
  737 +
  738 + $this->inicializarObjMetaBanco();
  739 +
  740 + $this->objDebug = InfraDebug::getInstance();
  741 + $this->objDebug->setBolLigado(true);
  742 + $this->objDebug->setBolDebugInfra(true);
  743 + $this->objDebug->setBolEcho(true);
  744 + $this->objDebug->limpar();
  745 + }
  746 +
  747 +}
  748 +
  749 +class PenAtualizarSipRN extends PenAtualizadorRN {
  750 +
  751 + protected $versaoMinRequirida = '1.30.0';
  752 + protected $sei_versao = 'PEN_VERSAO_MODULO_SIP';
  753 + private $arrRecurso = array();
  754 + private $arrMenu = array();
  755 +
  756 + /**
  757 + * Retorna/Cria a conexão com o banco de dados
  758 + *
  759 + * @return InfraIBanco
  760 + */
  761 + protected function inicializarObjInfraIBanco() {
  762 + if (empty($this->objBanco)) {
  763 +
  764 + $this->objBanco = BancoSip::getInstance();
  765 + }
  766 + return $this->objBanco;
  767 + }
  768 +
  769 + /**
  770 + * Retorna o ID do sistema
  771 + *
  772 + * @return int
  773 + */
  774 + protected function getNumIdSistema($strSigla = 'SIP') {
  775 +
  776 + $objDTO = new SistemaDTO();
  777 + $objDTO->setStrSigla($strSigla);
  778 + $objDTO->setNumMaxRegistrosRetorno(1);
  779 + $objDTO->retNumIdSistema();
  780 +
  781 + $objRN = new SistemaRN();
  782 + $objDTO = $objRN->consultar($objDTO);
  783 +
  784 + return (empty($objDTO)) ? '0' : $objDTO->getNumIdSistema();
  785 + }
  786 +
  787 + /**
  788 + *
  789 + * @return int Código do Menu
  790 + */
  791 + protected function getNumIdMenu($strMenu = 'Principal', $numIdSistema = 0) {
  792 +
  793 + $objDTO = new MenuDTO();
  794 + $objDTO->setNumIdSistema($numIdSistema);
  795 + $objDTO->setStrNome($strMenu);
  796 + $objDTO->setNumMaxRegistrosRetorno(1);
  797 + $objDTO->retNumIdMenu();
  798 +
  799 + $objRN = new MenuRN();
  800 + $objDTO = $objRN->consultar($objDTO);
  801 +
  802 + if (empty($objDTO)) {
  803 + throw new InfraException('Menu ' . $strMenu . ' não encontrado.');
  804 + }
  805 +
  806 + return $objDTO->getNumIdMenu();
  807 + }
  808 +
  809 + /**
  810 + *
  811 + * @return int Código do Recurso gerado
  812 + */
  813 + protected function criarRecurso($strNome = '', $strDescricao = null, $numIdSistema = 0) {
  814 +
  815 + $objDTO = new RecursoDTO();
  816 + $objDTO->setNumIdSistema($numIdSistema);
  817 + $objDTO->setStrNome($strNome);
  818 + $objDTO->setNumMaxRegistrosRetorno(1);
  819 + $objDTO->retNumIdRecurso();
  820 +
  821 + $objBD = new RecursoBD($this->getObjInfraIBanco());
  822 + $objDTO = $objBD->consultar($objDTO);
  823 +
  824 + if (empty($objDTO)) {
  825 +
  826 + $objDTO = new RecursoDTO();
  827 + $objDTO->setNumIdRecurso(null);
  828 + $objDTO->setStrDescricao($strDescricao);
  829 + $objDTO->setNumIdSistema($numIdSistema);
  830 + $objDTO->setStrNome($strNome);
  831 + $objDTO->setStrCaminho('controlador.php?acao=' . $strNome);
  832 + $objDTO->setStrSinAtivo('S');
  833 +
  834 + $objDTO = $objBD->cadastrar($objDTO);
  835 + }
  836 +
  837 + $this->arrRecurso[] = $objDTO->getNumIdRecurso();
  838 +
  839 + return $objDTO->getNumIdRecurso();
  840 + }
  841 +
  842 + /**
  843 + * Cria um menu
  844 + *
  845 + * @return int
  846 + */
  847 + protected function criarMenu($strRotulo = '', $numSequencia = 10, $numIdItemMenuPai = null, $numIdMenu = null, $numIdRecurso = null, $numIdSistema = 0) {
  848 +
  849 + $objDTO = new ItemMenuDTO();
  850 + $objDTO->setNumIdItemMenuPai($numIdItemMenuPai);
  851 + $objDTO->setNumIdSistema($numIdSistema);
  852 + $objDTO->setStrRotulo($strRotulo);
  853 + $objDTO->setNumIdRecurso($numIdRecurso);
  854 + $objDTO->setNumMaxRegistrosRetorno(1);
  855 + $objDTO->retNumIdItemMenu();
  856 +
  857 + $objBD = new ItemMenuBD($this->inicializarObjInfraIBanco());
  858 + $objDTO = $objBD->consultar($objDTO);
  859 +
  860 + if (empty($objDTO)) {
  861 +
  862 + $objDTO = new ItemMenuDTO();
  863 + $objDTO->setNumIdMenu($numIdMenu);
  864 + $objDTO->setNumIdMenuPai($numIdMenu);
  865 + $objDTO->setNumIdItemMenu(null);
  866 + $objDTO->setNumIdItemMenuPai($numIdItemMenuPai);
  867 + $objDTO->setNumIdSistema($numIdSistema);
  868 + $objDTO->setNumIdRecurso($numIdRecurso);
  869 + $objDTO->setStrRotulo($strRotulo);
  870 + $objDTO->setStrDescricao(null);
  871 + $objDTO->setNumSequencia($numSequencia);
  872 + $objDTO->setStrSinNovaJanela('N');
  873 + $objDTO->setStrSinAtivo('S');
  874 +
  875 + $objDTO = $objBD->cadastrar($objDTO);
  876 + }
  877 +
  878 + if (!empty($numIdRecurso)) {
  879 +
  880 + $this->arrMenu[] = array($objDTO->getNumIdItemMenu(), $numIdMenu, $numIdRecurso);
  881 + }
  882 +
  883 + return $objDTO->getNumIdItemMenu();
  884 + }
  885 +
  886 + public function addRecursosToPerfil($numIdPerfil, $numIdSistema) {
  887 +
  888 + if (!empty($this->arrRecurso)) {
  889 +
  890 + $objDTO = new RelPerfilRecursoDTO();
  891 + $objBD = new RelPerfilRecursoBD($this->inicializarObjInfraIBanco());
  892 +
  893 + foreach ($this->arrRecurso as $numIdRecurso) {
  894 +
  895 + $objDTO->setNumIdSistema($numIdSistema);
  896 + $objDTO->setNumIdPerfil($numIdPerfil);
  897 + $objDTO->setNumIdRecurso($numIdRecurso);
  898 +
  899 + if ($objBD->contar($objDTO) == 0) {
  900 + $objBD->cadastrar($objDTO);
  901 + }
  902 + }
  903 + }
  904 + }
  905 +
  906 + public function addMenusToPerfil($numIdPerfil, $numIdSistema) {
  907 +
  908 + if (!empty($this->arrMenu)) {
  909 +
  910 + $objDTO = new RelPerfilItemMenuDTO();
  911 + $objBD = new RelPerfilItemMenuBD($this->inicializarObjInfraIBanco());
  912 +
  913 + foreach ($this->arrMenu as $array) {
  914 +
  915 + list($numIdItemMenu, $numIdMenu, $numIdRecurso) = $array;
  916 +
  917 + $objDTO->setNumIdPerfil($numIdPerfil);
  918 + $objDTO->setNumIdSistema($numIdSistema);
  919 + $objDTO->setNumIdRecurso($numIdRecurso);
  920 + $objDTO->setNumIdMenu($numIdMenu);
  921 + $objDTO->setNumIdItemMenu($numIdItemMenu);
  922 +
  923 + if ($objBD->contar($objDTO) == 0) {
  924 + $objBD->cadastrar($objDTO);
  925 + }
  926 + }
  927 + }
  928 + }
  929 +
  930 + public function atribuirPerfil($numIdSistema) {
  931 +
  932 + $objDTO = new PerfilDTO();
  933 + $objBD = new PerfilBD($this->inicializarObjInfraIBanco());
  934 + $objRN = $this;
  935 +
  936 + // Vincula a um perfil os recursos e menus adicionados nos métodos criarMenu e criarReturso
  937 + $fnCadastrar = function($strNome, $numIdSistema) use($objDTO, $objBD, $objRN) {
  938 +
  939 + $objDTO->unSetTodos();
  940 + $objDTO->setNumIdSistema($numIdSistema);
  941 + $objDTO->setStrNome($strNome, InfraDTO::$OPER_LIKE);
  942 + $objDTO->setNumMaxRegistrosRetorno(1);
  943 + $objDTO->retNumIdPerfil();
  944 +
  945 + $objPerfilDTO = $objBD->consultar($objDTO);
  946 +
  947 + if (!empty($objPerfilDTO)) {
  948 + $objRN->addRecursosToPerfil($objPerfilDTO->getNumIdPerfil(), $numIdSistema);
  949 + $objRN->addMenusToPerfil($objPerfilDTO->getNumIdPerfil(), $numIdSistema);
  950 + }
  951 + };
  952 +
  953 + $fnCadastrar('ADMINISTRADOR', $numIdSistema);
  954 + $fnCadastrar('BASICO', $numIdSistema);
  955 + }
  956 +
  957 + /**
  958 + * Instala/Atualiza os módulo PEN para versão 1.0
  959 + */
  960 + protected function instalarV001() {
  961 +
  962 + $numIdSistema = $this->getNumIdSistema('SEI');
  963 + $numIdMenu = $this->getNumIdMenu('Principal', $numIdSistema);
  964 +
  965 + //----------------------------------------------------------------------
  966 + // Expedir procedimento
  967 + //----------------------------------------------------------------------
  968 + $this->criarRecurso('pen_procedimento_expedir', 'Expedir Procedimento', $numIdSistema);
  969 + $this->criarRecurso('apensados_selecionar_expedir_procedimento', 'Processos Apensados', $numIdSistema);
  970 + $numIdRecurso = $this->criarRecurso('pen_procedimento_expedido_listar', 'Processos Expedidos', $numIdSistema);
  971 + $this->criarMenu('Processos Expedidos', 55, null, $numIdMenu, $numIdRecurso, $numIdSistema);
  972 + //----------------------------------------------------------------------
  973 + // Mapeamento de documentos enviados
  974 + //----------------------------------------------------------------------
  975 + $this->criarRecurso('pen_map_tipo_doc_enviado_visualizar', 'Visualização de mapeamento de documentos enviados', $numIdSistema);
  976 +
  977 + // Acha o menu existente de Tipos de Documento
  978 + $objItemMenuDTO = new ItemMenuDTO();
  979 + $objItemMenuDTO->setNumIdSistema($numIdSistema);
  980 + $objItemMenuDTO->setNumIdMenu($numIdMenu);
  981 + $objItemMenuDTO->setStrRotulo('Tipos de Documento');
  982 + $objItemMenuDTO->setNumMaxRegistrosRetorno(1);
  983 + $objItemMenuDTO->retNumIdItemMenu();
  984 +
  985 + $objItemMenuBD = new ItemMenuBD($this->inicializarObjInfraIBanco());
  986 + $objItemMenuDTO = $objItemMenuBD->consultar($objItemMenuDTO);
  987 +
  988 + if (empty($objItemMenuDTO)) {
  989 + throw new InfraException('Menu "Tipo de Documentos" não foi localizado');
  990 + }
  991 +
  992 + $numIdItemMenuPai = $objItemMenuDTO->getNumIdItemMenu();
  993 +
  994 + // Gera o submenu Mapeamento
  995 + $_numIdItemMenuPai = $this->criarMenu('Mapeamento', 50, $numIdItemMenuPai, $numIdMenu, null, $numIdSistema);
  996 +
  997 + // Gera o submenu Mapeamento > Envio
  998 + $numIdItemMenuPai = $this->criarMenu('Envio', 10, $_numIdItemMenuPai, $numIdMenu, null, $numIdSistema);
  999 +
  1000 + // Gera o submenu Mapeamento > Envio > Cadastrar
  1001 + $numIdRecurso = $this->criarRecurso('pen_map_tipo_doc_enviado_cadastrar', 'Cadastro de mapeamento de documentos enviados', $numIdSistema);
  1002 + $this->criarMenu('Cadastrar', 10, $numIdItemMenuPai, $numIdMenu, $numIdRecurso, $numIdSistema);
  1003 +
  1004 + // Gera o submenu Mapeamento > Envio > Listar
  1005 + $numIdRecurso = $this->criarRecurso('pen_map_tipo_doc_enviado_listar', 'Listagem de mapeamento de documentos enviados', $numIdSistema);
  1006 + $this->criarMenu('Listar', 20, $numIdItemMenuPai, $numIdMenu, $numIdRecurso, $numIdSistema);
  1007 +
  1008 + // Gera o submenu Mapeamento > Recebimento
  1009 + $numIdItemMenuPai = $this->criarMenu('Recebimento', 20, $_numIdItemMenuPai, $numIdMenu, null, $numIdSistema);
  1010 +
  1011 + // Gera o submenu Mapeamento > Recebimento > Cadastrar
  1012 + $numIdRecurso = $this->criarRecurso('pen_map_tipo_doc_recebido_cadastrar', 'Cadastro de mapeamento de documentos recebidos', $numIdSistema);
  1013 + $this->criarMenu('Cadastrar', 10, $numIdItemMenuPai, $numIdMenu, $numIdRecurso, $numIdSistema);
  1014 +
  1015 + // Gera o submenu Mapeamento > Recebimento > Listar
  1016 + $numIdRecurso = $this->criarRecurso('pen_map_tipo_doc_recebido_listar', 'Listagem de mapeamento de documentos recebidos', $numIdSistema);
  1017 + $this->criarMenu('Listar', 20, $numIdItemMenuPai, $numIdMenu, $numIdRecurso, $numIdSistema);
  1018 +
  1019 + //Atribui as permissões aos recursos e menus
  1020 + $this->atribuirPerfil($numIdSistema);
  1021 + }
  1022 +
  1023 + protected function instalarV003R003S003IW001() {
  1024 +
  1025 +
  1026 + $objBD = new ItemMenuBD($this->inicializarObjInfraIBanco());
  1027 +
  1028 + //----------------------------------------------------------------------
  1029 + // Achar o root
  1030 +
  1031 + $numIdSistema = $this->getNumIdSistema('SEI');
  1032 + $numIdMenu = $this->getNumIdMenu('Principal', $numIdSistema);
  1033 +
  1034 + $objDTO = new ItemMenuDTO();
  1035 + $objDTO->setNumIdSistema($numIdSistema);
  1036 + $objDTO->setNumIdMenu($numIdMenu);
  1037 + $objDTO->setStrRotulo('Administração');
  1038 + $objDTO->setNumMaxRegistrosRetorno(1);
  1039 + $objDTO->retNumIdItemMenu();
  1040 +
  1041 + $objDTO = $objBD->consultar($objDTO);
  1042 +
  1043 + if (empty($objDTO)) {
  1044 + throw new InfraException('Menu "Administração" não foi localizado');
  1045 + }
  1046 +
  1047 + $numIdItemMenuRoot = $objDTO->getNumIdItemMenu();
  1048 + //----------------------------------------------------------------------
  1049 + // Acha o nodo do mapeamento
  1050 +
  1051 + $objItemMenuDTO = new ItemMenuDTO();
  1052 + $objItemMenuDTO->setNumIdSistema($numIdSistema);
  1053 + $objItemMenuDTO->setNumIdMenu($numIdMenu);
  1054 + $objItemMenuDTO->setStrRotulo('Mapeamento');
  1055 + $objItemMenuDTO->setNumSequencia(50);
  1056 + $objItemMenuDTO->setNumMaxRegistrosRetorno(1);
  1057 + $objItemMenuDTO->retTodos();
  1058 +
  1059 + $objItemMenuDTO = $objBD->consultar($objItemMenuDTO);
  1060 + if (!empty($objItemMenuDTO)) {
  1061 +
  1062 + $numIdItemMenuMapeamento = $objItemMenuDTO->getNumIdItemMenu();
  1063 +
  1064 + $objDTO = new ItemMenuDTO();
  1065 + $objDTO->setNumIdSistema($numIdSistema);
  1066 + $objDTO->setNumIdMenu($numIdMenu);
  1067 + $objDTO->setNumIdItemMenuPai($numIdItemMenuMapeamento);
  1068 + $objDTO->retTodos();
  1069 +
  1070 + $arrObjDTO = $objBD->listar($objDTO);
  1071 +
  1072 + if (!empty($arrObjDTO)) {
  1073 +
  1074 + $numIdItemMenuPai = $this->criarMenu('Processo Eletrônico Nacional', 0, $numIdItemMenuRoot, $numIdMenu, null, $numIdSistema);
  1075 + $numIdItemMenuPai = $this->criarMenu('Mapeamento de Tipos de Documento', 10, $numIdItemMenuPai, $numIdMenu, null, $numIdSistema);
  1076 +
  1077 + foreach ($arrObjDTO as $objDTO) {
  1078 +
  1079 + $objDTO->setNumIdItemMenuPai($numIdItemMenuPai);
  1080 +
  1081 + $objBD->alterar($objDTO);
  1082 + }
  1083 +
  1084 + $objBD->excluir($objItemMenuDTO);
  1085 + }
  1086 + }
  1087 + }
  1088 +
  1089 +}
  1090 +
  1091 +class PenConsoleRN extends InfraRN {
  1092 +
  1093 + protected $objRN;
  1094 + protected $strAction;
  1095 + protected $arrTokens = array();
  1096 + protected $objInfraBanco;
  1097 +
  1098 + public function __construct($objRN = null, $tokens = array()) {
  1099 +
  1100 + if(!is_null($objRN)) {
  1101 +
  1102 + parent::__construct();
  1103 +
  1104 + if(!is_object($objRN)) {
  1105 + throw new InfraException('Requerido objeto Infra');
  1106 + }
  1107 +
  1108 + if(get_parent_class($objRN) !== 'InfraRN') {
  1109 + throw new InfraException('Requerido objeto Infra que seja extendido de InfraRN');
  1110 + }
  1111 +
  1112 + $this->objRN = $objRN;
  1113 + }
  1114 +
  1115 + if(empty($tokens)) {
  1116 + $tokens = $_SERVER['argv'];
  1117 + }
  1118 +
  1119 + $this->criarTokens($tokens);
  1120 + }
  1121 +
  1122 + /**
  1123 + * Inicializador o banco de dados
  1124 + */
  1125 + protected function inicializarObjInfraIBanco() {
  1126 + if(empty($this->objInfraBanco)){
  1127 + $this->objInfraBanco = BancoSEI::getInstance();
  1128 + }
  1129 + return $this->objInfraBanco;
  1130 + }
  1131 +
  1132 + /**
  1133 + * Processa os parâmetros passados ao script pelo cli
  1134 + *
  1135 + * @param array $arguments
  1136 + * @return null
  1137 + */
  1138 + protected function criarTokens($arguments = array()){
  1139 +
  1140 + if(empty($arguments)) {
  1141 + throw new InfraException('Script não pode ser executado pela web');
  1142 + }
  1143 +
  1144 + $strScript = array_shift($arguments);
  1145 +
  1146 + if(!empty($this->objRN)) {
  1147 +
  1148 + $strAction = array_shift($arguments);
  1149 +
  1150 + if(substr($strAction, 0, 2) == '--') {
  1151 + throw new InfraException('O primeiro paramêtro deve ser uma action da RN');
  1152 + }
  1153 +
  1154 + $this->strAction = $strAction;
  1155 + }
  1156 +
  1157 + foreach($arguments as $key => $argument) {
  1158 +
  1159 + if(substr($argument, 0, 2) === '--'){
  1160 +
  1161 + $string = preg_replace('/^--/', '', $argument);
  1162 + $array = explode('=', $string);
  1163 +
  1164 + $key = array_shift($array);
  1165 + $value = (count($array) > 0) ? array_shift($array) : true;
  1166 +
  1167 + $this->arrTokens[$key] = $value;
  1168 + }
  1169 + }
  1170 + }
  1171 +
  1172 + /**
  1173 + * Retorna os parâmetros
  1174 + */
  1175 + public function getTokens(){
  1176 + return $this->arrTokens;
  1177 + }
  1178 +
  1179 + public function run(){
  1180 +
  1181 + if(empty($this->objRN)) {
  1182 + throw new InfraException('Nenhuma RN foi adicionada ao console');
  1183 + }
  1184 +
  1185 + if(!method_exists($this->objRN, $this->strAction)) {
  1186 +
  1187 + throw new InfraException(sprintf('Nenhuma ação "%s" foi encontrada em %s '.PHP_EOL.$this->objRN->ajuda(), $this->strAction, get_class($this->objRN)));
  1188 + }
  1189 +
  1190 + if(array_key_exists('ajuda', $this->arrTokens)) {
  1191 +
  1192 + print $this->objRN->ajuda();
  1193 + return true;
  1194 + }
  1195 +
  1196 + return call_user_func(array($this->objRN, $this->strAction), $this->getTokens());
  1197 + }
  1198 +
  1199 + public static function format($strMensagem = '', $strFonte = '', $bolBold = false){
  1200 +
  1201 + $strBold = ($bolBold !== false) ? '1' : '0';
  1202 +
  1203 + //$strMensagem = escapeshellarg($strMensagem);
  1204 +
  1205 + if(!empty($strFonte)) {
  1206 +
  1207 + switch($strFonte){
  1208 +
  1209 + case 'green':
  1210 + $strMensagem = "\033[".$strBold.";32m".$strMensagem;
  1211 + break;
  1212 +
  1213 + case 'red':
  1214 + $strMensagem = "\033[".$strBold.";31m".$strMensagem;
  1215 + break;
  1216 +
  1217 + case 'blue':
  1218 + $strMensagem = "\033[".$strBold.";34m".$strMensagem;
  1219 + break;
  1220 +
  1221 + case 'yellow':
  1222 + $strMensagem = "\033[".$strBold.";33m".$strMensagem;
  1223 + break;
  1224 +
  1225 + }
  1226 + }
  1227 + return static::resetAfter($strMensagem);
  1228 + }
  1229 +
  1230 + public static function resetAfter($strMensagem = ''){
  1231 +
  1232 + return $strMensagem. "\033[0m";
  1233 + }
  1234 +}
  1235 +
  1236 +try {
  1237 +
  1238 + $objPenConsoleRN = new PenConsoleRN();
  1239 + $arrArgs = $objPenConsoleRN->getTokens();
  1240 +
  1241 + $objAtualizarRN = new PenAtualizarSipRN($arrArgs);
  1242 + $objAtualizarRN->atualizarVersao();
  1243 +
  1244 + exit(0);
  1245 +} catch (Exception $e) {
  1246 +
  1247 + print InfraException::inspecionar($e);
  1248 +
  1249 + try {
  1250 + LogSEI::getInstance()->gravar(InfraException::inspecionar($e));
  1251 + } catch (Exception $e) {
  1252 +
  1253 + }
  1254 +
  1255 + exit(1);
  1256 +}
  1257 +
  1258 +print PHP_EOL;
... ...