Skip to content

Commit 8b41231

Browse files
committed
chore(release): versão 2.0.5 - Refatoração do osModal e SGP Cache
1 parent a4caae8 commit 8b41231

28 files changed

Lines changed: 1159 additions & 627 deletions

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,4 @@ secrets.*.js
2424
build.zip
2525
src/background/files.zip
2626
estrutura.txt
27+
refactoring_tracklist.md

CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,18 @@ Summary
99
5. version timestamp follow the yyyy.MM.dd format
1010
```
1111

12+
## 2.0.5 [2026.03.13]
13+
14+
### 🔥 Novidades & Refatoração (Major Update)
15+
- **Refatoração do Modal de O.S**: O antigo arquivo gigante `osModal.ts` foi completamente desmembrado em diversos módulos menores (`osModal.ts`, `osModalUI.ts`, `osModalSgp.ts`, `osModalHandlers.ts`, `osModalTypes.ts`). Manutenção e detecção de bugs muito mais ágil.
16+
- **Prevenção de Memory Leaks**: Implementado o padrão de `AbortController` em todos modais injetados na tela. Quando um modal é fechado, todos os event listeners daquele modal anexados no documento são destruídos instantaneamente.
17+
- **SGP Caching System (Anti-Rate Limit)**: A busca por dados do cliente no SGP ocorre **apenas uma vez por cliente** baseado na URL do chat (`chatId`). O recarregamento contínuo das rotas do SGP foi encerrado, reduzindo chamadas silenciosas e prevenindo bloqueios do provedor.
18+
- Limpeza automática de cache residual do SGP ao finalizar os atendimentos via clique no botão "Encerrar atendimento" no ChatMix.
19+
20+
### 🐛 Correções de Bugs
21+
- **Case-sensitivity no Build**: O arquivo corrompido ou referenciado erroneamente como `Quickreply` foi padronizado em todo o projeto para `quickReply.ts`, previnindo falhas severas de carregamento em sistemas de pacote que diferenciam maiúsculas (Vite/Linux).
22+
- Correção de dupla importação de Tipos de Domínio TypeScript.
23+
1224
## 0.0.0 [2026.03.10]
1325

1426
- feat: initial

CLAUDE.md

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
# Documentação do Projeto — Extensão ATI V2
2+
3+
## 🎯 Objetivo do Projeto
4+
Uma extensão para Google Chrome criada para integrar o sistema de chat de atendimento (**ChatMix**) com o Sistema de Gestão de Provedores (**SGP**). A extensão automatiza processos repetitivos para os atendentes, como inserção de respostas rápidas e, principalmente, a criação de Ordens de Serviço (O.S.) cruzando dados do cliente entre as duas plataformas.
5+
6+
## 🛠️ Stack Tecnológico
7+
- **Linguagem**: TypeScript
8+
- **Build Tool**: Vite com plugin CRXJS (`@crxjs/vite-plugin`) para manifest V3.
9+
- **Banco de Dados/Backend**: Firebase Realtime Database (Acessado via REST API, sem SDK pesado).
10+
- **Estilização**: CSS puro injetado via content scripts.
11+
12+
## 📂 Arquitetura de Pastas
13+
O projeto segue a separação estrita exigida pelo Manifest V3 do Chrome:
14+
15+
- `src/background/`: **Service Worker**. Roda isolado em background.
16+
- Único lugar permitido para fazer requisições externas críticas (SGP e Firebase) para evitar bloqueios de CORS.
17+
- `sgp/`: Lógica de extração e submissão silenciosa ('scraping' via endpoints internos) para o site do SGP.
18+
- `firebase.ts`: Comunicação (Auth e Database via REST) com o Firebase.
19+
- `src/contentScript/`: **Scripts injetados na página do ChatMix** (`chatmix.com.br`).
20+
- Lida exclusivamente com manipulação do DOM e UI da extensão.
21+
- `chatmix/`: Módulos específicos para atuar no ChatMix (observadores de DOM, injeção de botões).
22+
- `chatmix/os/`: Contém a lógica do Modal de O.S. (recentemente modularizado em `osModal.ts`, `osModalSgp.ts`, `osModalUI.ts`, `osModalHandlers.ts`, `osModalTypes.ts`).
23+
- `chatmix/auth/`: Lida com banners de login do Firebase sobrepostos ao ChatMix.
24+
- `src/popup/`: Interface HTML do ícone da extensão (caso necessário).
25+
26+
## 🧠 Regras de Negócio Críticas
27+
28+
### 1. Autenticação SGP (Cookies)
29+
A extensão **não** guarda senhas do SGP. Ela se aproveita do fato de o atendente já estar logado no SGP em outra aba do navegador.
30+
- As requisições em `background/sgp` usam `fetch` com `credentials: 'include'`.
31+
- Isso envia os cookies da sessão ativa do usuário para o SGP silenciosamente.
32+
33+
### 2. SGP Cache Policy (Prevenção de Rate Limit)
34+
Para evitar que a ATI seja bloqueada pelo SGP devido a múltiplas buscas automáticas:
35+
- **Regra**: O estado e dados de formulário do SGP (contratos do cliente, status online/offline, tipos de ocorrência) devem ser gerados **uma vez por cliente/chat**.
36+
- A extensão usa o `chatId` (ID da URL do ChatMix) como chave de cache principal.
37+
- O cache do SGP (`clearSgpCache`) **só deve ser limpo** quando:
38+
1. O atendente gera a O.S. ("Preencher no SGP" ou "Copiar").
39+
2. O atendente clica no botão "Encerrar atendimento" no ChatMix.
40+
3. A URL do chat muda drasticamente (mudança de sessão).
41+
42+
### 3. Comunicação Content Script ↔ Background
43+
- O `contentScript` **nunca** faz requisições diretas ao SGP ou Firebase (evita CORS e garante segurança de contexto).
44+
- Usa-se `chrome.runtime.sendMessage` com interfaces padronizadas (ver `src/background/types.ts`).
45+
- Exemplo: Content Script descobre o CPF no ChatMix → Pede ao Background `getSgpFormParams` → Background faz a busca no SGP com cookies cruzados → Retorna JSON para o Content Script renderizar o Modal.
46+
47+
### 4. Firebase (Templates e Respostas)
48+
- O `idToken` do Firebase tem validade (1 hora).
49+
- Respostas rápidas e Templates de O.S. (`modelos_os`, `respostas`) são cacheados em memória no service worker no início do plantão para máxima performance.
50+
- O Content script deve enviar o `chatId` e context data para o background hidratar os *placeholders* dinâmicos (`[SAUDACAO]`, `[HOJE]`) antes de jogar no DOM.
51+
52+
## 📝 Regras de Código e Boas Práticas (Para IAs)
53+
54+
1. **Sem tipo `any`**: O projeto utiliza TypeScript estrito. Se for criar código novo, declare e exporte as `Interfaces` apropriadas no respectivo arquivo `types.ts`.
55+
2. **Modularização do UI**: Arquivos que manipulam o DOM (`contentScript`) devem ser mantidos curtos e focados. Se um arquivo passar de 200-300 linhas (como era o `osModal.ts`), ele deve ser dividido em módulos lógicos (ex: `arquitetura_ui`, `arquitetura_api`, `arquitetura_eventos`).
56+
3. **Gerenciamento de Listeners**: Modais criados via ejetamento no DOM (`document.createElement`) que anexam eventos no `document` ou `body` **sempre** devem usar um `AbortController` (passando o `signal`) que é abortado quando o modal é destruído, evitando memory leaks.
57+
4. **Tratamento Seguro de HTML (XSS)**: Sempre que receber textos do Firebase ou do SGP para renderizar no ChatMix (via `.innerHTML`), garanta que o dado interno (`text`) passe por uma função de `escape` ou seja inserido via `.textContent` para evitar XSS.
58+
59+
## 🗄️ Integração com Banco de Dados
60+
Sempre consulte o arquivo `FIREBASE_SCHEMA.md` na raiz deste repositório para entender a estrutura em JSON da base de dados e as regras de segurança aplicáveis.
61+
62+
## 🕷️ Pontos de Falha Críticos (Dependência do DOM do ChatMix)
63+
A extensão dependende fortemente do HTML da página do ChatMix. Qualquer atualização no frontend deles pode quebrar a extensão.
64+
1. **Seletores CSS (`src/contentScript/chatmix/state.ts`)**: É ali que está o mapa do tesouro (ex: `#actionsContainerV2`, `.flex-none.p-4`). Se os botões ou o campo de texto (textarea) sumirem, o problema está nos seletores. Aja sempre atualizando-os.
65+
2. **Mutation Observers (`index.ts`)**: A extensão usa um `MutationObserver` para varrer alterações na tela e reinjetar os botões (O.S e Copy) toda vez que a URL ou o painel do chat muda.
66+
3. **Extração de Dados (`getClientData.ts` e `tryVisualIdentification.ts`)**: A extensão raspa o CPF/CNPJ ou Nome do cliente lendo o texto lateral ou o histórico do chat usando **Regex**. Novamente, uma mudança no layout ou formatação do texto no ChatMix vai requerer ajuste nas Regex nesses arquivos.

FIREBASE_SCHEMA.md

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
# Firebase — Regras e Estrutura de Dados
2+
3+
Este arquivo documenta as regras de segurança e a estrutura do Realtime Database usado pela extensão.
4+
5+
## 🔒 Regras de Segurança (`.rules`)
6+
7+
```json
8+
{
9+
"rules": {
10+
"admins": {
11+
"$uid": {
12+
".read": "auth != null && auth.uid === $uid",
13+
".write": "auth != null && auth.uid === $uid"
14+
}
15+
},
16+
"atendentes": {
17+
".read": true,
18+
"$username": {
19+
".write": "auth != null && ( (!data.exists() && newData.child('uid').val() === auth.uid) || (data.exists() && (root.child('admins').child(auth.uid).exists() || data.child('uid').val() === auth.uid)) )",
20+
".validate": "newData.hasChildren(['uid', 'nomeCompleto', 'role', 'status', 'email'])"
21+
}
22+
},
23+
"respostas": {
24+
".read": true,
25+
"$username": {
26+
".write": "root.child('atendentes').child($username).child('uid').val() === auth.uid"
27+
}
28+
},
29+
"modelos_os": {
30+
".read": true,
31+
"$username": {
32+
".write": "root.child('atendentes').child($username).child('uid').val() === auth.uid"
33+
}
34+
},
35+
"os_templates_master": {
36+
".read": "auth != null",
37+
".write": "auth != null && root.child('admins').child(auth.uid).exists()"
38+
},
39+
"sgp_cache": {
40+
".read": true,
41+
".write": "auth != null"
42+
}
43+
}
44+
}
45+
```
46+
47+
## 🗄️ Estrutura do Banco de Dados (Schema)
48+
49+
Abaixo está o mapeamento dos nós do banco de dados e os tipos de dados armazenados.
50+
51+
```json
52+
{
53+
// Lista de administradores globais do sistema
54+
"admins": {
55+
"$uid": true // Ex: "E7tiKEeA5AhwWHeqI9ilzbN2ofe2": true
56+
},
57+
58+
// Cadastro de atendentes associando Usuário do ChatMix (username) ao Firebase Auth UID
59+
"atendentes": {
60+
"$username": { // Ex: "victorh", "igormagalhaes", "helio"
61+
"email": "string",
62+
"nomeCompleto": "string",
63+
"role": "admin" | "usuario",
64+
"status": "ativo" | "inativo", // (Opcional)
65+
"uid": "string" // Firebase Auth UID associado ao username
66+
}
67+
},
68+
69+
// Templates de Ordens de Serviço INDIVIDUAIS por atendente
70+
"modelos_os": {
71+
"$username": {
72+
"$templateId": { // ID gerado pelo Firebase ou customizado (ex: "-Oa_o7t1m41WsIs4lzba" ou "old_2")
73+
"id": "string",
74+
"category": "string", // Ex: "Suporte", "Financeiro", "GERAL"
75+
"title": "string",
76+
"text": "string", // Texto do template (pode conter placeholders [HOJE], [SAUDACAO])
77+
"occurrenceTypeId": "string", // ID numérico em string referente ao Tipo de Ocorrência no SGP (ex: "1", "3", "42")
78+
"keywords": ["string"] // (Opcional) Lista de palavras-chave para busca/integração
79+
}
80+
}
81+
},
82+
83+
// Templates de O.S GLOBAIS (apenas leitura para usuários comuns, gravação para admins)
84+
"os_templates_master": {
85+
"os_templates": [
86+
{
87+
"title": "string",
88+
"category": "string",
89+
"text": "string",
90+
"occurrenceTypeId": "string",
91+
"keywords": ["string"] // (Opcional)
92+
}
93+
]
94+
},
95+
96+
// Respostas Rápidas (Quick Replies) INDIVIDUAIS por atendente
97+
"respostas": {
98+
"$username": [ // Array de quick replies
99+
{
100+
"title": "string",
101+
"category": "quick_reply", // Sempre "quick_reply"
102+
"subCategory": "string", // Subcategoria (ex: "Suporte", "Financeiro", "Geral", "Desastres", "Planos")
103+
"text": "string" // Texto da resposta rápida
104+
}
105+
]
106+
},
107+
108+
// Cache gerenciado pelo script de background (Tipos de Ocorrência do SGP)
109+
"sgp_cache": {
110+
// Definido dinamicamente pela extensão
111+
}
112+
}
113+
```
114+
115+
### Notas sobre o Modelo Estrutural:
116+
- O banco é centrado na chave `$username` (nome do usuário no ChatMix).
117+
- A relação entre o `uid` (Firebase) e o `$username` (ChatMix) reside no nó `/atendentes/$username/uid`.
118+
- Regras de gravação de segurança exigem que o usuário autenticado só possa escrever nas respostas e modelos de OS que pertençam ao `$username` correspondente ao seu `uid` mapeado no nó `atendentes`.

package-lock.json

Lines changed: 2 additions & 41 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "ati-auxiliar-de-atendimentos",
33
"displayName": "ATI - Auxiliar de Atendimentos",
4-
"version": "2.0.4",
4+
"version": "2.0.5",
55
"author": "Vituali",
66
"description": "Extensão para auxiliar atendentes do suporte ATI Internet no ChatMix",
77
"type": "module",

0 commit comments

Comments
 (0)