← story.propek
STORY 9.9
CRM Bug Fixes Sprint 1
Epic: Epic 9 — CRM Database Foundation
DONE
ACCEPTANCE CRITERIA (30/30)
AC1.1: Importar `decryptPII` de `src/utils/encryption.ts` em todas as rotas CRM que retornam dados de customers
AC1.2: Aplicar `decryptPII()` nos resultados de `customers.ts` (listagem e busca)
AC1.3: Aplicar `decryptPII()` nos resultados de `ficha360.ts` (dados do cliente na ficha)
AC1.4: Aplicar `decryptPII()` nos resultados de `conversations.ts` (nomes de clientes em conversas)
AC1.5: Aplicar `decryptPII()` nos resultados de `deals.ts` (nomes de clientes vinculados a deals)
AC1.6: Funcao aplicada APENAS em campos PII (nao em phone_number, metadata, etc.)
AC1.7: Clientes do Kommo (texto puro) continuam exibindo corretamente apos decriptacao (funcao deve ser idempotente — se nao e ciphertext, retorna o valor original)
AC1.8: Verificar via curl que nomes dos 64 clientes do bot aparecem legiveis
AC2.1: Busca por nome em `customers.ts` deve funcionar para clientes criptografados E nao-criptografados
AC2.2: Estrategia: decriptar nomes em memoria e filtrar, OU adicionar busca por `phone_number` como alternativa
AC2.3: Se busca em memoria: limitar a paginacao razoavel (nao carregar todos os 4.016 clientes de uma vez)
AC2.4: Busca por telefone (`phone_number ILIKE '%{term}%'`) DEVE funcionar como fallback
AC2.5: Verificar via curl que busca retorna resultados corretos
AC3.1: Verificar se coluna `note_type` existe na tabela `attendant_notes` na VPS (migration 025 pode ja ter sido executada)
AC3.2: Se coluna NAO existe: criar migration `030_add_note_type_column.sql` com `ALTER TABLE attendant_notes ADD COLUMN IF NOT EXISTS note_type VARCHAR(20) DEFAULT 'general'`
AC3.3: Se coluna JA existe: verificar que o INSERT em `ficha360.ts` usa valor compativel
AC3.4: Garantir que `crm_user` tem permissao de INSERT na tabela `attendant_notes`
AC3.5: Verificar via curl que criacao de nota funciona sem erro
AC4.1: Criar arquivo `src/config/crm-database.ts` com pool dedicado usando `crm_user`
AC4.2: Pool CRM usa variaveis de ambiente separadas: `CRM_DB_USER`, `CRM_DB_PASSWORD` (ou fallback para `crm_user` hardcoded)
AC4.3: NAO modificar `src/config/database.ts` — o pool principal do bot DEVE continuar usando `propek_user`
AC4.4: Atualizar todas as rotas em `src/api/crm/` para usar o pool CRM em vez do pool principal
AC4.5: Configurar `CRM_DB_USER=crm_user` e `CRM_DB_PASSWORD` nas env vars da VPS (pm2 ecosystem ou .env)
AC4.6: Verificar que RLS policies (Story 9.1) estao ativas para `crm_user`
AC4.7: Bot WhatsApp continua operando normalmente apos a mudanca
AC5.1: Nenhuma credencial hardcoded no codigo (usar env vars)
AC5.2: Senha do `crm_user` NUNCA logada ou exibida
AC5.3: Bot WhatsApp continua online (verificar pm2 status)
AC5.4: Restart do bot via pm2 apos deploy das mudancas
AC5.5: Todas as queries CRM usam parameterized queries ($1, $2)
TIMELINE
01/04/2026
chore: session cleanup — 10 stories Done, security+QA gates, MCC setup, V4 audit [Stories 6.3, 7.2, 9.9, 9.10, 9.11, 9.12, 19.4, 20.1, 20.2, 21.3]
550daa2
25/03/2026
fix: CRM Bug Fixes Sprint 1 — decrypt PII, hybrid search, CRM pool [Story 9.9]
4c0157f
ARQUIVOS (7)
propek-whatsapp-bot/src/api/crm/customers.ts MODIFY
propek-whatsapp-bot/src/api/crm/ficha360.ts MODIFY
propek-whatsapp-bot/src/api/crm/conversations.ts MODIFY
propek-whatsapp-bot/src/api/crm/deals.ts MODIFY
propek-whatsapp-bot/src/config/crm-database.ts CREATE
apps/crm/migrations/030_add_note_type_column.sql SKIP
docs/stories/active/story-9.9-crm-bug-fixes-sprint1.md UPDATE
RETROSPECTIVA
Qualidade: ★★★☆☆
Incluir @qa no proximo ciclo
Rodar @cyber-chief antes do push