Files
mercado.clube67.com/docs/atualizacao.md
T

305 lines
4.9 KiB
Markdown

PROJETO: CRM COMPLETO DE GERENCIAMENTO DE SORTEIOS COM PREÇO DINÂMICO, SORTEIO AUTOMÁTICO E NOTIFICAÇÕES
OBJETIVO:
Construir um sistema completo (backend + frontend) para gerenciamento de sorteios com:
- Venda de números
- Preço dinâmico por horário/período
- Preço fixo padrão
- Execução automática de sorteios
- Sistema de notificações (in-app + WhatsApp + email)
- Área do ganhador (resgate de prêmio)
- Auditoria completa e rastreabilidade
STACK:
- Frontend: React + Next.js (App Router)
- Backend: Next.js API Routes ou Node.js
- Banco: PostgreSQL
- ORM: Prisma
- Redis (recomendado para lock e reservas)
- Worker: BullMQ ou node-cron
---
MODELAGEM DO BANCO:
Tabela: raffles
- id
- title
- description
- total_numbers
- price_default
- status (draft, active, finished)
- start_at
- end_at
- created_at
Tabela: raffle_price_rules
- id
- raffle_id
- type (fixed, time_range)
- price
- start_time (nullable)
- end_time (nullable)
- priority
- created_at
Tabela: raffle_numbers
- id
- raffle_id
- number
- status (available, reserved, sold)
- reserved_until
- user_id
- order_id
Tabela: orders
- id
- user_id
- raffle_id
- total_amount
- status (pending, paid, canceled)
- payment_method
- created_at
Tabela: order_items
- id
- order_id
- raffle_number_id
- price_paid
Tabela: price_logs
- id
- raffle_id
- applied_price
- rule_id
- applied_at
Tabela: raffle_results
- id
- raffle_id
- winner_number_id
- seed
- algorithm_version
- drawn_at
- created_at
Tabela: raffle_claims
- id
- raffle_id
- user_id
- status (pending, approved, delivered)
- delivery_type (pickup, shipping)
- notes
- updated_at
Tabela: notifications
- id
- user_id
- type (winner, purchase, reminder)
- title
- message
- read (boolean)
- metadata (json)
- created_at
Tabela: raffle_draw_logs
- id
- raffle_id
- seed
- result_number
- executed_at
- ip
- created_at
---
ENGINE DE PREÇO:
Criar função getCurrentPrice(raffleId):
1. Buscar regras do sorteio
2. Filtrar regras válidas:
- fixed → sempre válido
- time_range → validar horário atual
3. Ordenar por prioridade DESC
4. Retornar preço da regra mais prioritária
5. Fallback → price_default
IMPORTANTE:
- Salvar preço aplicado em order_items.price_paid
- Não recalcular após venda
---
REGRAS DE NEGÓCIO:
1. Reserva de número:
- status = reserved
- expira em 5 minutos (Redis recomendado)
2. Compra:
- validar disponibilidade
- criar order + order_items
- atualizar número → sold
3. Concorrência:
- lock via Redis ou transação DB
4. Auditoria:
- registrar preço aplicado (price_logs)
---
MOTOR DE SORTEIO AUTOMÁTICO:
TRIGGERS:
- por horário (end_at)
- por lotação (todos vendidos)
- manual (admin)
ALGORITMO:
seed = SHA256(
raffle.id +
raffle.end_at +
total_sold +
last_order_id
)
winnerIndex = seed % total_sold_numbers
PROCESSO:
1. calcular seed
2. selecionar número vencedor
3. salvar em raffle_results
4. atualizar raffle.status = finished
5. salvar log em raffle_draw_logs
6. disparar notificações
IMPORTANTE:
- resultado deve ser auditável
- seed deve ser exibido para transparência
- impedir alterações após sorteio
---
SISTEMA DE NOTIFICAÇÕES:
TIPOS:
- winner (ganhador)
- purchase (compra confirmada)
- reminder (lembrete)
EXEMPLO:
{
"type": "winner",
"title": "Parabéns! Você ganhou",
"message": "Você ganhou com o número 072",
"raffle_id": 1
}
CANAIS:
- In-app (obrigatório)
- WhatsApp (API externa)
- Email (fallback)
---
FLUXO DE NOTIFICAÇÃO:
Ao finalizar sorteio:
1. identificar ganhador
2. criar notification (winner)
3. enviar WhatsApp
4. enviar email
---
ÁREA DO GANHADOR:
Tela: Meus Prêmios
- listar sorteios ganhos
- número vencedor
- status:
- pending
- approved
- delivered
Tela: Detalhe do prêmio
- dados do sorteio
- botão:
- confirmar dados
- solicitar retirada
---
TELAS DO CRM:
1. Gestão de Sorteios
2. Regras de Preço
3. Mapa de Números (grid interativo)
4. Pedidos
5. Financeiro
6. Resultados de sorteio
7. Notificações
8. Gestão de prêmios (claims)
---
RELATÓRIOS:
1. Vendas por dia
2. Vendas por hora
3. Preço aplicado
4. Números vendidos
5. Receita total
6. Taxa de conversão
7. Performance por faixa de horário
---
ENDPOINTS:
POST /raffles
GET /raffles
POST /raffles/:id/price-rules
GET /raffles/:id/current-price
POST /orders
GET /orders
POST /raffles/:id/draw
GET /raffles/:id/result
POST /notifications
GET /notifications
---
WORKER / CRON:
- verificar sorteios vencidos
- executar draw automático
- disparar notificações
---
REGRAS CRÍTICAS:
- snapshot de preço no momento da compra
- bloquear alterações após sorteio
- logs completos de execução
- sistema auditável
- prevenção de fraude
---
DIFERENCIAIS:
- transparência (seed + algoritmo)
- preço dinâmico inteligente
- notificações automáticas multicanal
- sistema preparado para escala
- base pronta para IA futura (precificação e comportamento)