GLPI não abre mais chamado em 2022

Esse 2022 já veio que veio.

Para quem usa o Behaviors com o formato yymmaa0000 está sofrendo com uma limitação do Tipo campo no mysql do GLPI que é INT 32 bits e ao ultrapassar a ID 2.147.483.647 o banco não aceita novos incrementos na tabela.

Se você NÃO USA ESSE FORMATO de chamados no seu GLPI, esse artigo não se aplica a você!

Algumas soluções de contorno estão abaixo na ordem de mais para menos recomendado.

  1. Desativar o uso do Formato do número do chamado ymd0001 e Reiniciar o auto incremento para pegar o ID anterior e apenas incrementar para o próximo número
  2. Desativar o uso do Formato do número do chamado ymd0001 e Criar um novo incremento manualmente todos os anos ou meses
  3. Alterar as tabelas de ID para o formato BIGINT. Não recomendo neste momento por poucos testes realizados e por uma pequena parcela da comunidade ter colocado em produção.

Lembre-se de realizar ‘backups’ e testar em bases de homologação sempre que for mexer em bancos de dados ou arquivos do GLPI

Solução 1 — Reiniciar o autoincrement

ALTER TABLE glpi_tickets AUTO_INCREMENT = 1;

Se seu 2021 terminou com o chamado 2112310523, o próximo será 2112310524 e assim por diante.

Prós

  • Você volta a abrir chamados instantaneamente
  • Se for alterado agum parâmetro que permita reutilizar o formato de ID, você pode voltar, pois, não serão usados IDs que se tornarão datas futuras (Não existem 37 dias em meses de dezembro.

Contra

  • Você perde a referência de ano, mês e dias do ID do chamado
  • Você terá “apenas” pouco mais de 35 milhões de IDs disponíveis para novos chamados.

Solução 2 — Criar um padrão regularmente

ALTER TABLE glpi_tickets AUTO_INCREMENT=2122010001;

Você precisa alterar todos os meses ou anos e vai perdendo os IDs entre esses avanços.

O campo anterior para Ano, se manterá 21 para sempre. O campo posterior é que será o ano e ignora-se os dois primeiros campos.

xx22010001
xx22020001

Exemplos:

Em Janeiro ALTER TABLE glpi_tickets AUTO_INCREMENT=2122010001;
Em Fevereiro ALTER TABLE glpi_tickets AUTO_INCREMENT=2122020001;
Em Março ALTER TABLE glpi_tickets AUTO_INCREMENT=2122030001;

Ou apenas alterar anualmente.

Prós

  • Você volta a abrir chamados instantaneamente
  • Você permanece com a referência de Ano e/ou Mês. A depender da maneira escolhida de incrementar o ID.

Contra

  • Você vai perdendo alguns milhares de ID a cada incremento futuro
  • Não tem volta. Você vai usando IDs de datas posteriores e não tem como voltar.

Solução 3 – Alterar o tipo de campo direto no MySQL

Para esse deixarei a discussão do github do plugin.

Invalide ticket format number · Issue #4 · yllen/behaviors (github.com)

Não tem como voltar o campo depois. Faça por sua conta e risco.

Se, em algum momento sair uma solução para a limitação de IDs em 2.147.483.647, podemos voltar a usar o behaviors com o parâmetro de ymd0001.

➤ Site: https://www.arthurschaefer.com.br
➤ Instagram: https://instagram.com/arthurrschaefer
➤ Facebook: https://facebook.com/arthurschaefercombr
➤ LinkedIn: https://br.linkedin.com/in/arthurramosschaefer
➤ Twitter: https://www.twitter.com/arthurrschaefer
➤ Inscreva-se no Canal: https://www.youtube.com/ArthurSchaefer
➤ Canal no Telegram: https://t.me/arthurschaefer
➤ Baviera TI: https://www.bavierati.com.br
➤ Servicedesk Brasil: https://www.servicedeskbrasil.com.br
➤ Conheça a Teclib Cloud: https://www.arthurschaefer.com.br/glpicloud

4 pensou em “GLPI não abre mais chamado em 2022

  1. Anderson PETERLE

    Brother, avaliei algumas propostas de soluções e optei por refatorar os tickets já existentes:

    – Fiz um levantamento e totalizei até 13 tabelas utilizando os IDs dos tickets;
    – Refatorei esses IDs retirando a dezena do ano, ou seja, o ID 2101050001 passou a ser o ID 101050001;
    – Customizei o código para a correta obtenção do próximo sequencial (método beforeAdd em ../plugins/behaviors/inc/ticket.class.php):

    No meu caso, eu tinha aproximadamente 32.000 tickets registrados. Contabilizando as 13 tabelas, tive uma média de 416.000 updates, que consumiram aproximadamente 4 horas e 40 minutos;

    Como definí o fim de semana de 08 e 09/01/2022 para toda a manobra acima, estamos operando desde 10/01/2022 em plena normalidade!

    Caso seja interessante postar os trechos de códigos aqui, me avise informando inclusive se há tags específicas a serem usadas…

    Sucesso e bom 22 a todos!

    Responder
    1. Arthur Schaefer Autor do post

      Perfeito Anderson. Fique a vontade por compartilhar.
      As tags são markdown.
      code entre sinal de maior e menor brindo e fechando com a /code coloca o código formatado como monoespaçado

      Responder
    2. Anderson PETERLE

      Conforme meu post anterior, coloco abaixo os códigos que usei como solução de contorno.
      Vale observar que considerei como data inicial 01/01/2021 na consulta montada em $querySEL, pois minha base de tickets passou a ser alimentada naquele mês:

      – Script para a refatoração dos tickets pré-existentes na base:

      <?php
      /* Objetivo: Refatorar e aplicar solução de contorno para o limite de valor 2147483647 do campo glpi_tickets.id em função de seu tipo INT. A partir da refatoração, será adotado o formato YMMDDxxxx para o sequenciamento de tickets. (O formato anterior impediu novos sequenciais a partir de 2201010001). */

      use Glpi\Event;

      define('GLPI_ROOT', "/var/www/html/glpi");

      include (GLPI_ROOT . "/inc/based_config.php");
      include (GLPI_ROOT . "/inc/includes.php");

      echo '=========================================================================';
      echo 'GLPI - Refatoração de base para adequação ao formato yMMDDxxxx apos episódio da virada 2021/2022';
      echo '========================================================================';
      echo '=> Catalogando sequenciais de tickets existentes na base a partir de 25/01/2021 (data de início de operação do SuporteINSS)...';

      $querySEL = "";
      $querySEL .= "SELECT id ";
      $querySEL .= "FROM glpi_tickets ";
      $querySEL .= "WHERE id > 2101010000 ";
      $querySEL .= "ORDER BY id";

      $arrTablesFields = [];

      if ($resultSEL = $DB->query($querySEL)) {
      $intTotalResult = $resultSEL->num_rows;
      $intLoopResult = 1;

      $arrTablesFields = ['glpi_documents_items' => 'items_id',
      'glpi_events' => 'items_id',
      'glpi_groups_tickets' => 'tickets_id',
      'glpi_items_tickets' => 'tickets_id',
      'glpi_itilfollowups' => 'items_id',
      'glpi_itilsolutions' => 'items_id',
      'glpi_logs' => 'items_id',
      'glpi_plugin_escalade_histories' => 'tickets_id',
      'glpi_plugin_formcreator_issues' => 'original_id',
      'glpi_queuednotifications' => 'items_id',
      'glpi_tickets' => 'id',
      'glpi_tickets_users' => 'tickets_id',
      'glpi_tickettasks' => 'tickets_id'];

      if ($intTotalResult){
      echo date('d/m/y h:i:s') . ' => Encontrados ' . $intTotalResult . ' tickets para tratamento...';
      echo date('d/m/y h:i:s') . ' => Tabelas a serem tratadas (' . count($arrTablesFields) . '):';
      $intLoopTables = 1;
      foreach($arrTablesFields as $tableName => $fieldName){
      echo '................................... ' . str_pad($intLoopTables , 2 , '0' , STR_PAD_LEFT) . ') ' . $tableName . ' => ' . $fieldName . '';
      $intLoopTables++;
      }
      }else{
      echo date('d/m/y h:i:s') . ' => Não foram encontrados tickets para tratamento...';
      }

      while ($dataSEL = $DB->fetchAssoc($resultSEL)) {
      $strId = substr($dataSEL['id'] , 1);

      foreach($arrTablesFields as $tableName => $fieldName){
      $queryUPD = "UPDATE $tableName SET $fieldName=" . $strId . " WHERE $fieldName=" . $dataSEL['id'];

      $DB->query($queryUPD);
      }

      $intLoopResult++;
      }
      if ($intTotalResult){
      echo '';
      echo date('d/m/y h:i:s') . ' => REFATORACAO CONCLUIDA!';
      }
      }else{
      echo 'NADA ENCONTRADO!';
      }

      echo '';

      unset($arrTablesFields);
      unset($resultSEL);

      – Trecho para customização do método beforeAdd (../glpi/plugins/behaviors/inc/ticket.class.php), que deve substituir o conteúdo dentro da condição “if ($config->getField(‘tickets_id_format’))”:


      $max = 0;
      $strYMD = date('ymd'); // Exemplo: 220103
      $strYMD = substr($strYMD , 1); // Exemplo: 20103

      $sql = ['SELECT' => 'id',
      'FROM' => 'glpi_tickets',
      'WHERE' => 'id like "' . $strYMD . '%"',
      'ORDERBY' => 'id DESC limit 1'];

      foreach ($DB->request($sql) as $data) {
      $max = $data['id'];
      }

      // A BASE DE DADOS DEVERÁ TER SIDO REFATORADA PREVIAMENTE PARA REFORMATAÇÃO DOS NÚMEROS DE TICKETS, EXCLUINDO O PRIMEIRO DÍGITO, TRANSFORMANDO DE "21MMDDXXXX" PARA "1MMDDXXXX", POR EXEMPLO;

      // - Caso não exista sequencial para a data atual, inicializo-o com '0001'.
      if (!$max){
      $want = $strYMD . '0001';
      $DB->query("ALTER TABLE `glpi_tickets` AUTO_INCREMENT=$want");
      }

      Responder
  2. Pingback: Migrando as tabelas de ID de chamados para Unsigned no GLPI | Arthur Schaefer

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *