Consolida os dois controladores legados que decidiam status/fechamento de forma concorrente (processGlpiClosureController + processStatusController) em um único processTicketLifecycleController, eliminando a dependência do campo source_last (mantido só como rastro de auditoria) e a flag ENABLE_STATUS_SYNC (removida). Isso corrige o bug de reabertura: chamados reabertos no SN voltavam a ser fechados no GLPI porque a regra de precedência de finalização do fluxo legado forçava o status do GLPI de volta pro SN. Correções de bugs encontrados em teste (Frente 1): - Constraint UNIQUE em ticket_sync.sn_ticket_id + ON CONFLICT DO NOTHING na criação do registro, prevenindo duplicação de tickets. - Fechamento no SN agora é confirmado por leitura ao vivo do status antes de marcar o ticket como solved/closed, em vez de confiar só no HTTP 200 (a API do SN pode retornar sucesso e silenciosamente ignorar um valor de estado inválido — descoberto e corrigido também no mandante). - Nota de encerramento do SN pro GLPI agora é idempotente e criada uma única vez por ticket. - Erros de sincronização passam a ter um limite de tentativas (MAX_ERROR_RETRIES) antes de marcar o ticket como error_permanent, exigindo intervenção manual em vez de tentar para sempre. - Chamados criados no GLPI passam a gravar o número do ticket do SN no campo externalid. Nova funcionalidade (Frente 2): quando o SN resolve/encerra um chamado por conta própria antes do GLPI, além da nota informativa no GLPI (agora com o nome de quem encerrou, buscado ao vivo via resolved_by/closed_by/ sys_updated_by), o próprio SN recebe um aviso de que a Sothis não vai mais atender aquele chamado e ele é transferido pra fila de TI da CAOA. Nova funcionalidade (Mandante, regras 19-22): espelhamento opcional e configurável de status intermediário (Aguardando Atendimento/Em Atendimento/Em Espera) entre os dois sistemas, controlado pela env MANDANTE=GLPI|SNOW. Sem essa env configurada, mantém o comportamento atual (nenhum espelhamento de status intermediário). Nunca afeta os status finais (resolvido/encerrado/fora de escopo), que continuam regidos pelas regras fixas de fechamento. Corrigido também o workflow de deploy (.gitea/workflows/deploy-production.yml), que ainda validava os controladores antigos (já removidos) e exigia ENABLE_STATUS_SYNC=true, o que quebraria o próximo deploy em produção. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
3.1 KiB
3.1 KiB
Sistema de Integracao ServiceNow <-> GLPI
Middleware Node.js para integrar chamados entre ServiceNow e GLPI, usando PostgreSQL como banco intermediario e acesso ao banco do GLPI.
Estado atual
- Coleta de tickets SN por watermark.
- Criacao/vinculo de tickets no GLPI (grava
external_idno GLPI com o numero do ticket SN). - Sincronizacao de comentarios e tasks em duas direcoes.
- Preenchimento do campo "Ticket Externo" no SN com o ID GLPI.
- Motor de regras unico (
processTicketLifecycleController) para status/fechamento/reabertura:status=5(resolver SN),status=6(encerrar definitivamente no SN), nota no GLPI quando o SN resolve/encerra por conta propria (com aviso e troca de fila no SN), reabertura automatica e regra de fora de escopo.
Fluxo do ciclo
Executado pelo main():
processErrorControllerprocessTicketsControllerprocessTicketLifecycleController(quandoENABLE_GLPI_CLOSE_CRON=true)processCommentsController
Documentacao detalhada
- Fluxo tecnico: docs/fluxo.md
- Regras de negocio completas: docs/regrasdenegocio.md
- Casos de uso: docs/casosdeuso.md
- Plano e checklist de rollout: docs/checklist.md
Variaveis de ambiente importantes
Feature flags
ENABLE_GLPI_CLOSE_CRONtrue: liga o motor de regras de status/fechamento/reabertura (processTicketLifecycleController)false: desliga o motor inteiro
ServiceNow
SERVICENOW_TABLE_INCIDENT_URLSERVICENOW_TABLE_REQUEST_URLSERVICENOW_TABLE_JOURNAL_URLSERVICENOW_SC_ITEM_OPTION_URLSERVICENOW_DEFAULT_USERSERVICENOW_IGNORE_DEFAULT_USER_JOURNALSERVICENOW_EXTERNAL_TICKET_FIELD(default:u_external_ticket)
GLPI e banco intermediario
GLPI_DB_*SNGLPI_DB_*GLPI_OOS_SOLUTION_TYPE_ID
Desenvolvimento
- Instalar dependencias:
npm install
- Criar env:
copy .env.example .env.development
- Executar:
npm run dev
Producao
Deploy manual na VM
git pull origin master
npm ci --omit=dev
pm2 start ecosystem.config.js --env production
pm2 save
Se o processo ja estiver rodando:
pm2 restart sn-glpi-sync-cron --update-env
Deploy via Gitea Actions
O workflow .gitea/workflows/deploy-production.yml roda no runner com rotulo vm-prod.
- Configure a variavel do repositorio
PROD_DEPLOY_PATHcom o caminho da aplicacao na VM de producao. Se nao configurar, o workflow usa/opt/sn-glpi-sync-new. - Garanta que o arquivo
.env.productionexista nesse caminho na VM e contenhaSERVICENOW_CAOA_TI_GROUP_IDpreenchido. - Faça push na branch
masterou execute o workflow manualmente em Actions. - Acompanhe pelo Gitea Actions ou na VM:
pm2 list
pm2 logs sn-glpi-sync-cron
Observacoes
- O projeto ainda nao tem suite automatizada robusta.
- O rollout recomendado e por fases com feature flags.
- Nao remover schema legado antes de estabilizar o fluxo novo.
- Consulte
docs/checklist.mdantes de cada deploy para validar pre e pos-subida.