✅ Checklist: Qualification Agent
Status: 🟢 Implementado
Prioridade: 4 (Pode ser implementado em paralelo)
Estimativa: 1-2 semanas
Implementado em: 2026-01-25
📋 Resumo
| Item | Valor |
|---|---|
| Código | qualification |
| Porta | 8023 |
| Database | csuite_context |
| Prefixo API | /v1/qualification |
| Traefik Path | /qualification/ |
| Depende de | Credit Agent (para score de crédito) |
🎯 Objetivo
Gate de entrada do canal. Decide se uma nova revenda vale o investimento de cultivar, qual tier atribuir e quais limites iniciais definir.
Frase-guia: Não é um agente para dizer "sim". É um agente para dizer "vale a pena".
📊 Decisões Possíveis
| Decisão | Significado | Próximo Passo |
|---|---|---|
APPROVE_STRATEGIC |
Alta prioridade | Onboarding prioritário |
APPROVE_LIMITED |
Aprovado com restrições | Onboarding com limites |
HOLD |
Precisa mais análise | Aguardar/observar |
DO_NOT_CULTIVATE |
Não vale investir | Sem onboarding |
📊 Tiers de Revenda
| Tier | Descrição | Tratamento |
|---|---|---|
STRATEGIC |
Alto potencial, alinhado | Prioridade máxima |
OPPORTUNISTIC |
Bom potencial, não core | Atenção moderada |
TRANSACTIONAL |
Volume, baixa margem | Autoatendimento |
LIMITED |
Alto risco ou baixo fit | Limites restritivos |
📊 Scores Calculados
| Score | O que Mede | Peso |
|---|---|---|
strategic_fit_score |
Alinhamento com estratégia | 40% |
potential_value_score |
Valor potencial de receita | 35% |
operational_readiness_score |
Capacidade operacional | 25% |
✅ Fases de Implementação
Fase 1: Estrutura Base
- [x] Criar diretório
/c-suite/agents/qualification/ - [x] Criar
requirements.txt
fastapi==0.104.1 uvicorn==0.24.0 mysql-connector-python==8.2.0 pydantic==2.5.2 python-dotenv==1.0.0 httpx==0.25.2 - [x] Criar
.env.example - [x] Criar
main.py(FastAPI app) - [x] Criar
app/__init__.py - [x] Criar
app/settings.py - [x] Criar
app/database.py
Fase 2: Schema SQL
- [x] Criar
sql/schema.sql - [x] Criar tabela
channel_qualifications - [x] Criar índices
- [x] Executar no RDS DEV
- [x] Criar
sql/views.sql
Fase 3: Modelos Python
- [x] Criar
app/models.py - [x]
QualificationDecisionEnum - [x]
TierEnum - [x]
OperationalCapacityEnum - [x]
QualifyRequest- input para qualificação - [x]
QualificationResult- output com scores e decisão - [x]
QualificationRecord- registro completo
Fase 4: Repository (Queries)
- [x] Criar
app/repository.py - [x]
save_qualification(account_id, result) - [x]
get_qualification(account_id) - [x]
get_qualifications_by_decision(decision) - [x]
get_qualifications_by_tier(tier) - [x]
get_pending_reviews()- HOLD que precisam ser revisados - [x]
update_qualification(account_id, override_data) - [x]
get_metrics(period)
Fase 5: Heuristics (Lógica de Decisão)
- [x] Criar
app/heuristics.py - [x]
calculate_strategic_fit(account_data)- alinhamento estratégico- Região prioritária?
- Segmento alvo?
- Perfil de carteira compatível?
- [x]
calculate_potential_value(account_data)- valor potencial- Potencial de receita estimado
- Histórico (se existir)
- Tamanho do mercado local
- [x]
calculate_operational_readiness(account_data)- capacidade- Estrutura operacional
- Capacidade de estoque
- Logística
- [x]
calculate_overall_score(scores)- score final ponderado - [x]
determine_tier(overall_score, fit_score)- qual tier - [x]
determine_decision(tier, risk_factors)- decisão final - [x]
calculate_initial_limits(tier, credit_score)- limites iniciais
Fase 6: Integrações Externas
- [x] Criar
app/credit_client.py- Credit Agent - [x]
get_credit_score(cnpj) - [x]
get_credit_limit_suggestion(cnpj) - [x] Criar
app/state_client.py- Account State Agent - [x]
create_new_state(account_id)- criar estado NEW - [x] Criar
app/onboarding_client.py- Onboarding Agent - [x]
trigger_onboarding(account_id, tier)- disparar onboarding
Fase 7: Routes/API
- [x] Criar
routes/__init__.py - [x] Criar
routes/core.py - [x]
GET /- info - [x]
GET /health- health check - [x] Criar
routes/qualification.py - [x]
POST /v1/qualification/evaluate- avaliar nova revenda - [x]
GET /v1/qualification/{account_id}- consultar qualificação - [x]
POST /v1/qualification/{account_id}/override- override manual - [x]
GET /v1/qualification/pending-review- precisam revisão - [x]
GET /v1/qualification/by-tier/{tier}- listar por tier - [x]
GET /v1/qualification/by-decision/{decision}- listar por decisão - [x]
GET /v1/qualification/metrics- métricas
Fase 8: Policies
- [x] Criar
policies/__init__.py - [x] Criar
policies/qualification.py - [x] Thresholds de score para cada tier
- [x] Regras de bloqueio automático
- [x] Limites por região/segmento
- [x] Regras de conflito de canal
Fase 9: Docker
- [x] Criar
Dockerfile - [x] Criar
docker-stack.yml - [x] Criar
deploy.sh - [x] Build local e testar
Fase 10: Deploy DEV
- [x] Adicionar ao
docker-stack-dev.ymlprincipal - [x] Configurar secrets
- [x] Deploy em DEV
- [x] Testar endpoints via curl
- [x] Verificar logs
Fase 11: Integração com Fluxo de Cadastro
- [ ] Este agente NÃO aparece diretamente no Seller Cockpit
- [ ] Integrar com processo de cadastro de revendas (leads-agent ou admin)
- [ ] Disparar automaticamente ao cadastrar nova revenda
- [ ] Criar webhook ou evento para iniciar qualificação
Fase 12: Integração Admin (Opcional)
- [ ] Se existir admin panel, mostrar:
- [ ] Lista de qualificações pendentes (HOLD)
- [ ] Formulário de override manual
- [ ] Métricas de qualificação
Fase 13: Documentação
- [x] Criar
README.mdcompleto - [x] Documentar API endpoints
- [x] Documentar critérios de qualificação
- [ ] Atualizar
AGENTS_OVERVIEW.md
Fase 14: Testes
- [ ] Testar cada endpoint
- [ ] Testar cálculo de scores
- [ ] Testar determinação de tier
- [ ] Testar limites iniciais
- [ ] Testar integração com Credit Agent
- [ ] Testar disparo de Onboarding
📁 Estrutura de Arquivos
qualification/
├── .env.example
├── Dockerfile
├── README.md
├── deploy.sh
├── docker-stack.yml
├── main.py
├── requirements.txt
├── app/
│ ├── __init__.py
│ ├── credit_client.py
│ ├── database.py
│ ├── heuristics.py
│ ├── models.py
│ ├── onboarding_client.py
│ ├── repository.py
│ ├── settings.py
│ └── state_client.py
├── policies/
│ ├── __init__.py
│ └── qualification.py
├── routes/
│ ├── __init__.py
│ ├── core.py
│ └── qualification.py
└── sql/
├── schema.sql
└── views.sql
🔌 API Endpoints
| Método | Endpoint | Descrição |
|---|---|---|
| GET | / |
Info do serviço |
| GET | /health |
Health check |
| POST | /v1/qualification/evaluate |
Avaliar nova revenda |
| GET | /v1/qualification/{account_id} |
Consultar qualificação |
| POST | /v1/qualification/{account_id}/override |
Override manual |
| GET | /v1/qualification/pending-review |
Precisam revisão |
| GET | /v1/qualification/by-tier/{tier} |
Listar por tier |
| GET | /v1/qualification/by-decision/{decision} |
Listar por decisão |
| GET | /v1/qualification/metrics |
Métricas |
📊 Schema SQL Principal
CREATE TABLE IF NOT EXISTS channel_qualifications (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
org_id INT NOT NULL DEFAULT 1,
account_id VARCHAR(100) NOT NULL,
-- Input Data
cnpj VARCHAR(20),
company_name VARCHAR(255),
region VARCHAR(50),
city VARCHAR(100),
state VARCHAR(2),
segment VARCHAR(100),
-- Analysis Inputs
estimated_potential DECIMAL(15,2),
credit_score INT,
credit_limit_suggested DECIMAL(15,2),
operational_capacity ENUM('LOW', 'MEDIUM', 'HIGH'),
years_in_business INT,
employee_count INT,
existing_relationship BOOLEAN DEFAULT FALSE,
-- Calculated Scores (0-100)
strategic_fit_score INT,
potential_value_score INT,
operational_readiness_score INT,
overall_score INT,
-- Decision
decision ENUM('APPROVE_STRATEGIC', 'APPROVE_LIMITED', 'HOLD', 'DO_NOT_CULTIVATE') NOT NULL,
tier_assigned ENUM('STRATEGIC', 'OPPORTUNISTIC', 'TRANSACTIONAL', 'LIMITED'),
decision_reasons JSON,
risk_factors JSON,
-- Initial Limits
initial_credit_limit DECIMAL(15,2),
initial_discount_limit DECIMAL(5,2),
initial_payment_terms INT, -- dias
-- Metadata
evaluated_by VARCHAR(50) DEFAULT 'system',
evaluated_at DATETIME NOT NULL,
expires_at DATETIME, -- qualificação expira após X meses
-- Override
overridden BOOLEAN DEFAULT FALSE,
overridden_by VARCHAR(50),
overridden_at DATETIME,
override_reason TEXT,
original_decision ENUM('APPROVE_STRATEGIC', 'APPROVE_LIMITED', 'HOLD', 'DO_NOT_CULTIVATE'),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_account (org_id, account_id),
INDEX idx_decision (decision),
INDEX idx_tier (tier_assigned),
INDEX idx_score (overall_score)
);
📊 Critérios de Score
Strategic Fit Score (0-100)
def calculate_strategic_fit(data):
score = 50 # base
# Região prioritária (+20)
if data.region in PRIORITY_REGIONS:
score += 20
# Segmento alvo (+15)
if data.segment in TARGET_SEGMENTS:
score += 15
# Relacionamento existente (+10)
if data.existing_relationship:
score += 10
# Anos no mercado (+5 por ano, max 15)
score += min(data.years_in_business, 3) * 5
return min(score, 100)
Potential Value Score (0-100)
def calculate_potential_value(data):
# Baseado no potencial estimado
if data.estimated_potential >= 500000:
return 100
elif data.estimated_potential >= 200000:
return 80
elif data.estimated_potential >= 100000:
return 60
elif data.estimated_potential >= 50000:
return 40
else:
return 20
Decision Matrix
overall_score >= 80 AND fit >= 70 → APPROVE_STRATEGIC + STRATEGIC
overall_score >= 60 AND fit >= 50 → APPROVE_LIMITED + OPPORTUNISTIC
overall_score >= 40 → APPROVE_LIMITED + TRANSACTIONAL
overall_score >= 20 AND no_risk_factors → HOLD
else → DO_NOT_CULTIVATE
✅ Critérios de Conclusão
- [x] Qualificação sendo calculada corretamente
- [x] Scores coerentes com critérios
- [x] Tiers sendo atribuídos corretamente
- [x] Limites iniciais definidos
- [x] Integração com Credit Agent (HTTP client pronto)
- [x] Disparo de Onboarding automático (HTTP client pronto)
- [x] Override manual funcionando
- [x] README completo
- [x] Deploy em DEV funcionando
🔗 Próximos Passos
- ~~Executar SQL~~ ✅ Concluído
- ~~Build e Deploy~~ ✅ Concluído
- ~~Testar Endpoints~~ ✅ Funcionando via curl
- Integrar - Conectar com fluxo de cadastro de revendas
📊 Teste de Validação (25/01/2026)
Endpoint testado: POST /v1/qualification/evaluate
Input:
{
"account_id": "TEST-001",
"company_name": "Distribuidora Teste LTDA",
"state": "SP",
"estimated_potential": 250000,
"years_in_business": 5
}
Output:
- ✅ Decision: APPROVE_STRATEGIC
- ✅ Tier: STRATEGIC
- ✅ Overall Score: 85
- ✅ Initial Credit Limit: R$ 100.000
- ✅ Initial Discount Limit: 15%
Atualizado: 2026-01-25 18:39