Clube de Recompensas — Níveis
Pré-requisitos de acesso
- Permissão (módulo):
viewRewardsProgram(para ler) /manageRewardsLevels(para criar/editar/excluir/reordenar) - Licença/Feature:
REWARDS_CLUB - Contêiner do menu: GERAL → grupo Clube de Recompensas
O que é / quando usar
Gerencia os níveis (tiers) do clube de forma totalmente dinâmica: você cria quantos níveis quiser, com nome livre, threshold (limiar de entrada), cor, ícone e lista de benefícios. A ordem é definida por drag-and-drop. Cada nível pode ter uma NFT de tier gerada inline.
Use ao desenhar a escada de fidelidade (ex.: Bronze → Prata → Ouro → Diamante) e ao ajustar limiares/benefícios ao longo do tempo.
Pré-condições
- Permissão:
viewRewardsProgrampara ler;manageRewardsLevelspara editar (permissão dupla: enum CPM + módulo dinâmico no DB). - Licença/Feature:
REWARDS_CLUB. - Dependências de outras telas: o Programa define a métrica e o fiat de referência — isso muda como o threshold é exibido: em pts quando a métrica é
POINTS, ou na moeda de referência quando é financeira.
Passo a passo
- Acesse o menu Clube de Recompensas → Níveis (
/rewards-club/levels). - A lista mostra os níveis ordenados; arraste pelas alças para reordenar (persiste automaticamente).
- Clique em Novo (ou em um nível para editar) — abre o drawer lateral.
- Preencha código do tier, nome, descrição, threshold, cor, ícone e benefícios.
- Salve. Para gerar a NFT do nível, use o botão Gerar NFT na linha.
Campos
| Campo | O que é | Obrigatório? | Efeito no sistema/backend |
|---|---|---|---|
Tier (tier) | Código do nível (string livre, ex.: OURO) | Sim | Normalizado para MAIÚSCULAS com _ no lugar de espaços. É a chave do nível (junto do programa). Não pode duplicar ao criar. |
Nome (customName → name) | Nome exibido do nível | Sim | Rótulo amigável do tier. |
Descrição (description) | Texto descritivo | Não | Texto livre. |
Threshold (threshold → minThresholdFiat) | Limiar mínimo para entrar no nível | Sim | Comparado com a métrica do programa. Exibido em pts (métrica POINTS) ou na moeda de referência (métrica financeira). Trafega como string BigNumber. |
Cor (badgeColor → colorHex) | Cor do badge (hex) | Sim | Cor visual do nível; há paleta sugerida em ciclo. |
Ícone (iconName) | Ícone do badge (Material Icons) | Não | Quick-picker com sugestões (troféu, medalha, diamante…). |
Benefícios (benefits[]) | Lista de benefícios do nível | Não | Editor por linhas. Linhas no formato chave: valor viram benefícios estruturados (ex.: indicationBonusPercent: 5); as demais viram um label. |
Ordem (order → sortOrder) | Posição do nível | Sim (gerenciada) | Definida por drag-and-drop; renumerada em múltiplos de 10 (10, 20, 30…) para facilitar inserções futuras. |
NFT do tier (tierNftAssetId) | Asset NFT que representa o nível | Não | undefined = ainda não gerado. O botão Gerar NFT cria o asset via tknLib (idempotente). |
Ações e modais
- Reordenar (drag-and-drop): persiste a nova ordem via
PATCH .../levels/reorderimediatamente (atualização otimista; em erro, recarrega para desfazer). - Salvar nível:
PUT /v1/rewards-club/admin/levels/:tier. Exige step-up (senha + MFA). Valida tier obrigatório, ausência de duplicidade ao criar, e nome preenchido. - Excluir nível:
DELETE .../levels/:tiercom step-up. Bloqueado se houver usuários no tier — o backend respondeok=false+reason=USERS_IN_TIER+usersInTier, e a UI mostra quantos usuários impedem a exclusão. - Gerar NFT:
POST .../levels/:tier/generate-nft. Idempotente: se já existir, retornaalreadyExists=truee apenas vincula oassetId.
Regras de negócio / cuidados
Atenção
- Não é possível excluir um nível que tenha usuários posicionados nele — esvazie/migre os usuários antes. Isso protege a integridade do tier engine.
- A NFT do tier deve ser bloqueada para venda/revenda (block_sell e block_resell) — é um selo, não um ativo negociável. A geração inline já cria o asset adequado.
- A exibição do threshold depende da métrica do Programa: confira lá antes de definir limiares (pts vs. fiat).
Irreversível
- Gerar NFT cria um asset on-chain via tknLib. A operação é idempotente (não duplica), mas o asset criado representa o nível permanentemente — trate o
tierNftAssetIdcomo definitivo para aquele tier.
- Valores financeiros: thresholds trafegam como string BigNumber — sem arredondamento.
Exemplos
Cenário 1 — Escada financeira em BRL
Programa com métrica DEPOSIT_VOLUME, janela LIFETIME, fiat BRL.
- Crie Bronze (threshold
0), Prata (5000), Ouro (20000), Diamante (100000). - Defina cores/ícones distintos; adicione benefícios (ex.:
indicationBonusPercent: 5no Ouro). - Arraste para garantir a ordem Bronze < Prata < Ouro < Diamante.
- Gere a NFT de cada nível pelo botão inline.
Cenário 2 — Escada por pontos
Programa com métrica POINTS.
- Os thresholds passam a ser exibidos em pts. Defina, ex.: Bronze
0, Prata1000, Ouro5000. - Garanta missões pontuadoras em Missões para que os usuários acumulem pontos.
Cenário 3 — Tentativa de exclusão bloqueada
Ao excluir "Prata" com 37 usuários no tier:
- A confirmação é aceita, mas o backend retorna
USERS_IN_TIERcomusersInTier=37. - A UI informa que 37 usuários impedem a exclusão.
- Ajuste thresholds/recompute para migrar os usuários e tente novamente.