Módulo 07: Veículos & FIPE — API
Status: Rascunho Inicial Regras de negócio: ver
regras-negocio/07_veiculos_fipe.mdDomínio: verdominio/veiculo.md
1. Contratos de API (RESTful)
1.1 Veículos do Cliente
GET /api/clientes/{cliente_id}/veiculos
Auth: Consultor | Gestor | Admin
Return: [{ id, tipo, placa, marca, modelo, ano_fabricacao, ano_modelo, chassi, codigo_fipe, valor_base_informado }]
POST /api/clientes/{cliente_id}/veiculos
Auth: Consultor | Gestor
Body: {
tipo,
placa?,
chassi?,
renavam?,
marca,
modelo,
ano_fabricacao,
ano_modelo,
cor?,
codigo_fipe?,
valor_base_informado?
}
Return: { id }
Errors:
422 — placa e chassi ausentes simultaneamente
409 — placa já cadastrada para outro veículo no tenant
GET /api/veiculos/{id}
Auth: Consultor (cliente na carteira) | Gestor | Admin
Return: { ...atributos completos, propostas_associadas[], contratos[], vistorias[] }
PUT /api/veiculos/{id}
Auth: Consultor | Gestor
Body: { placa?, chassi?, renavam?, cor?, valor_base_informado? }
Nota: tipo, marca, modelo, ano_fabricacao e ano_modelo são imutáveis após criação.
Return: 200 OK
1.2 Serviços FIPE
GET /api/fipe/busca-placa
Auth: Consultor | Gestor | Admin
Query: ?placa=ABC1D23
Return: {
placa,
marca,
modelo,
ano_fabricacao,
ano_modelo,
chassi_mascarado,
codigo_fipe,
valor_fipe_atual,
mes_referencia
}
Nota: Internamente o CRM consome a API externa configurada no tenant.
Errors:
404 — Placa não encontrada na API externa
503 — API externa indisponível (sugerir entrada manual)
GET /api/fipe/marcas
Auth: Público (requer token de sessão)
Query: ?tipo=carros | motos | caminhoes
Return: [{ codigo, nome }]
Nota: Consulta o cache local sincronizado (CSV mensal).
GET /api/fipe/modelos
Auth: Público (requer token de sessão)
Query: ?tipo=carros&marca_id=123
Return: [{ codigo, nome }]
GET /api/fipe/anos
Auth: Público (requer token de sessão)
Query: ?tipo=carros&marca_id=123&modelo_id=456
Return: [{ codigo, nome, valor_atual, mes_referencia }]
1.3 Administração do Cache FIPE (Admin)
GET /api/admin/fipe/status
Auth: Admin | Super Admin
Return: { ultima_sincronizacao_at, mes_referencia, total_registros, status: "OK | DESATUALIZADO | SINCRONIZANDO" }
POST /api/admin/fipe/sincronizar
Auth: Admin | Super Admin
Return: { job_id, status: "ENFILEIRADO" }
Nota: Execução assíncrona. O progresso pode ser consultado via /api/admin/jobs/{job_id}.
2. Schemas de Dados
Veículo
{
"id": "uuid",
"tenant_id": "uuid",
"cliente_id": "uuid",
"tipo": "CARRO | MOTO | CAMINHAO | BICICLETA | OUTROS",
"marca": "string",
"modelo": "string",
"ano_fabricacao": "integer",
"ano_modelo": "integer",
"placa": "string | null",
"chassi": "string | null",
"renavam": "string | null",
"cor": "string | null",
"codigo_fipe": "string | null",
"valor_base_informado": "decimal | null",
"created_at": "datetime",
"updated_at": "datetime"
}
FipeHistorico (tabela interna)
{
"id": "uuid",
"codigo_fipe": "string",
"tipo": "CARRO | MOTO | CAMINHAO",
"marca": "string",
"modelo": "string",
"ano_referencia": "string",
"valor": "decimal",
"mes_referencia": "YYYY-MM",
"importado_em": "datetime"
}
3. Segurança e Boas Práticas
| Regra | Implementação |
|---|---|
| Silo de dados | tenant_id validado em toda operação. Consultor só acessa veículos de clientes da sua carteira. |
| Imutabilidade | tipo, marca, modelo, ano_fabricacao e ano_modelo não são aceitos no body de PUT. Backend deve ignorar ou rejeitar com 400 se enviados. |
| Congelamento de FIPE | O valor monetário FIPE não é armazenado no veículo. É consultado e congelado na Proposta no momento da criação (ver Módulo 08). |
| Credenciais da API externa | A chave da API de dados veiculares é armazenada criptografada (AES-256) nas configurações do tenant. Nunca exposta nas respostas da API. |
| Sincronização assíncrona | O endpoint POST /api/admin/fipe/sincronizar apenas enfileira o job — não executa sincronamente. Usar sistema de filas (ex: Bull, Celery) para processar em background. |
| Fallback documentado | Se a API externa retornar 503, o sistema registra o erro em log e retorna 503 ao frontend com mensagem orientando o usuário a usar a entrada manual. |