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

4.9 KiB

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)