hubxglpi/fluxoEntidade.md

232 lines
7.6 KiB
Markdown

# Fluxo de Resolução e Criação de Entidades (GLPI)
## Contexto
Quando um chamado de **Implantação** chega no Hub x GLPI, precisamos garantir que exista uma **Entidade** correta no GLPI para vincular o ticket.
Hoje, a resolução tenta encontrar a entidade pelo padrão de nome baseado em:
- `codigoCliente`
- `codigoServico`
- `nomeCliente`
Caso não encontre, entra a feature de **criação automática via API (GLPI v2 + OAuth)**.
> Regra importante: **criação/alteração de entidades sempre via API**, nunca via banco do GLPI.
---
## Convenções de Nome
### Entidade mãe (Cliente)
- **Formato:** `{codigoCliente} - {nomeCliente}`
- **Exemplo:** `12345 - ACME Telecom`
### Entidade filha (Serviço)
- **Formato:** `{codigoCliente} - {codigoServico} - {nomeCliente}`
- **Exemplo:** `12345 - 67890 - ACME Telecom`
> Observação: O `{nomeCliente}` é repetido na filha para manter legibilidade e facilitar busca manual no GLPI.
---
## Busca de Entidades
### Busca por Serviço (Entidade filha)
Procura por entidade que contenha:
- `{codigoCliente} - {codigoServico}` (prefixo/like)
### Busca por Cliente (Entidade mãe)
Procura por entidade que contenha:
- `{codigoCliente} -` (prefixo/like)
---
## Opção A — Criação hierárquica (Mãe + Filha quando necessário)
### Objetivo
Garantir hierarquia consistente no GLPI:
- Cliente como entidade mãe
- Serviço como entidade filha
### Fluxo (passo a passo)
1. **Tentar encontrar entidade por Serviço**
- Busca: `{codigoCliente} - {codigoServico}*`
- Se encontrou:
- ✅ usar essa entidade (filha) e finalizar
2. **Se não encontrou por Serviço: tentar encontrar entidade por Cliente**
- Busca: `{codigoCliente} -*`
- Se encontrou:
- ✅ criar **entidade filha** abaixo dessa mãe:
- Nome: `{codigoCliente} - {codigoServico} - {nomeCliente}`
- Parent: `{codigoCliente} - {nomeCliente}`
- ✅ usar a entidade criada (filha) e finalizar
3. **Se não encontrou nem por Serviço nem por Cliente**
- Criar **entidade mãe**:
- Nome: `{codigoCliente} - {nomeCliente}`
- Parent: raiz (definir entidade pai padrão, ex.: Root)
- Criar **entidade filha** abaixo da mãe:
- Nome: `{codigoCliente} - {codigoServico} - {nomeCliente}`
- Parent: `{codigoCliente} - {nomeCliente}`
- ✅ usar a entidade criada (filha) e finalizar
### Resultado final (Opção A)
- Ticket sempre fica na **entidade filha** (serviço)
- Sempre tenta manter **estrutura hierárquica** consistente
---
### Diagrama de Fluxo — Opção A (hierárquica: Mãe + Filha quando necessário)
```mermaid
flowchart TD
A[Chamado de Implantação chega do Hub] --> B[Extrair dados<br/>codigoCliente<br/>codigoServico<br/>nomeCliente]
B --> C{Existe entidade<br/>por Serviço?}
C -->|Sim| D[Usar entidade de Serviço]
D --> Z[Fim / Continua fluxo do ticket]
C -->|Não| E{Existe entidade<br/>por Cliente?}
E -->|Sim| F[Criar entidade de Serviço<br/>via API GLPI]
F --> G[Parent = Entidade Cliente<br/>Nome = codigoCliente-codigoServico-nomeCliente]
G --> Z
E -->|Não| H[Criar entidade Cliente<br/>via API GLPI]
H --> I[Parent = Contratos Ativos<br/>Nome = codigoCliente-nomeCliente]
I --> J[Criar entidade de Serviço<br/>via API GLPI]
J --> K[Parent = Entidade Cliente<br/>Nome = codigoCliente-codigoServico-nomeCliente]
K --> Z
```
## Opção B — Criação simplificada (sem forçar hierarquia)
### Objetivo
Criar o mínimo possível e evitar duplicação de entidades.
### Fluxo (passo a passo)
1. **Tentar encontrar entidade por Serviço**
- Busca: `{codigoCliente} - {codigoServico}*`
- Se encontrou:
- ✅ usar essa entidade e finalizar
2. **Se não encontrou por Serviço: tentar encontrar entidade por Cliente**
- Busca: `{codigoCliente} -*`
- Se encontrou:
- ✅ usar essa entidade mãe
- ❌ não cria entidade filha
- Finaliza
3. **Se não encontrou nem por Serviço nem por Cliente**
- Criar **uma entidade única (sem mãe)**:
- Nome: `{codigoCliente} - {codigoServico} - {nomeCliente}`
- Parent: raiz (ou padrão definido)
- ✅ usar essa entidade e finalizar
### Resultado final (Opção B)
- Ticket pode ficar:
- na entidade de serviço (se existir)
- ou na entidade de cliente (se existir)
- ou numa entidade única criada
- Não garante hierarquia “mãe → filha”
---
### Fluxo Opção B
```mermaid
flowchart TD
A[Chamado de Implantação chega do Hub] --> B[Extrair dados<br/>codigoCliente<br/>codigoServico<br/>nomeCliente]
B --> C{Existe entidade<br/>por Serviço?}
C -->|Sim| D[Usar entidade de Serviço]
D --> Z[Fim / Continua fluxo do ticket]
C -->|Não| E{Existe entidade<br/>por Cliente?}
E -->|Sim| F[Usar entidade de Cliente]
F --> Z
E -->|Não| G[Criar entidade Única<br/>via API GLPI]
G --> H[Parent = Root<br/>Nome = codigoCliente-codigoServico-nomeCliente]
H --> Z
```
## Opção C — Híbrida (Implantação cria; demais apenas resolvem)
### Objetivo
- Para **Implantação**: garantir estrutura correta criando entidades quando necessário (igual Opção A).
- Para **demais tipos de chamado**: **não criar entidades**, apenas resolver a melhor entidade existente; se não houver, usar fallback **Contratos Ativos**.
---
### Fluxo (passo a passo)
#### 1) Identificar tipo do chamado
- Se `tipo == Implantação` → executar **Fluxo A (criação hierárquica)**.
- Se `tipo != Implantação` → executar **Fluxo de Resolução sem criação**.
---
### Fluxo A (quando Implantação)
Segue exatamente a **Opção A**:
1. Buscar entidade por Serviço (`{codigoCliente} - {codigoServico}%`)
2. Se não achar, buscar por Cliente (`{codigoCliente} -%`)
3. Se achar Cliente, criar Serviço abaixo do Cliente
4. Se não achar nenhum, criar Cliente (embaixo de Contratos Ativos) e depois criar Serviço abaixo do Cliente
5. Retornar sempre a **entidade de Serviço**
---
### Fluxo de Resolução (quando NÃO é Implantação)
1. Buscar entidade por Serviço (`{codigoCliente} - {codigoServico}%`)
- Se achou: ✅ usar e finalizar
2. Se não achou, buscar entidade por Cliente (`{codigoCliente} -%`)
- Se achou: ✅ usar e finalizar
3. Se não achou nenhum dos dois:
- ✅ usar entidade **Contratos Ativos** (fallback)
- ❌ não criar nada
---
### Resultado final (Opção C)
- **Implantação**: sempre aponta para entidade de **Serviço**, criando Cliente/Serviço quando faltar.
- **Demais chamados**: nunca criam entidades; ficam na melhor existente (Serviço → Cliente → Contratos Ativos).
---
### Diagrama de Fluxo — Opção C (Híbrida)
```mermaid
flowchart TD
A[Chega chamado do Hub] --> B[Extrair dados<br/>codigoCliente<br/>codigoServico<br/>nomeCliente<br/>tipoChamado]
B --> C{Tipo é<br/>Implantação?}
%% ========== RAMO IMPLANTAÇÃO (OPÇÃO A) ==========
C -->|Sim| IA{Existe entidade<br/>por Serviço?}
IA -->|Sim| I1[Usar entidade de Serviço] --> Z[Fim / Continua fluxo do ticket]
IA -->|Não| IB{Existe entidade<br/>por Cliente?}
IB -->|Sim| I2[Criar entidade de Serviço<br/>via API GLPI<br/>Parent = Cliente] --> I3[Usar entidade criada] --> Z
IB -->|Não| I4[Criar entidade Cliente<br/>via API GLPI<br/>Parent = Contratos Ativos] --> I5[Criar entidade de Serviço<br/>via API GLPI<br/>Parent = Cliente] --> I6[Usar entidade criada] --> Z
%% ========== RAMO NÃO IMPLANTAÇÃO (RESOLVE ONLY) ==========
C -->|Não| NA{Existe entidade<br/>por Serviço?}
NA -->|Sim| N1[Usar entidade de Serviço] --> Z
NA -->|Não| NB{Existe entidade<br/>por Cliente?}
NB -->|Sim| N2[Usar entidade de Cliente] --> Z
NB -->|Não| N3[Usar entidade fallback<br/>Contratos Ativos] --> Z
```