Skip to content

Fidelidade — Programa de Selos

O módulo fidelidade (backend/src/loyalty/) implementa programas de cartão-fidelidade do tipo stamp card (ex: "compre 9, ganhe 1 grátis"), vinculados a categorias do cardápio.

Visão Geral

CaracterísticaDetalhe
Módulo backendbackend/src/loyalty/
Controllerloyalty.controller.ts
SchemasLoyaltyCampaign, StampCard, RewardCode
Permissão adminAdmin ou Superadmin
Rota/t/:slug/admin/loyalty

Schemas

LoyaltyCampaign (schemas/campaign.schema.ts)

CampoTipoDescrição
tenantObjectId
namestringNome interno da campanha
qualifyingCategoriesObjectId[]Categorias do cardápio que geram selos
stampsRequirednumberSelos para completar o cartão
rewardTypeenumfree_item | percent_discount | fixed_discount
rewardValuenumber?Percentual ou valor fixo (para os tipos de desconto)
rewardItemIdObjectId?Item gratuito (quando rewardType = free_item)
expirationDaysnumber?Dias até cartão incompleto expirar
activeboolean
totalStampsIssuednumberContador acumulado
totalCardsCompletednumber
totalRewardsRedeemednumber

StampCard (schemas/stamp-card.schema.ts)

CampoTipoDescrição
campaignObjectId → LoyaltyCampaign
tenantObjectId
customerPhonestringChave do cliente
stampsnumberSelos acumulados neste cartão
lastStampAtDate
completedAtDate?null = cartão em aberto

Índice único: { campaign, customerPhone, completedAt: null } — garante um cartão ativo por campanha por cliente.

RewardCode (schemas/reward-code.schema.ts)

Código gerado ao completar o cartão; único por campanha + cliente + data.

Fluxo de Stamp

Pedido pago → itens da categoria qualificante?
         ↓ Sim
LoyaltyService.stampCard(tenantId, customerPhone, orderId)

StampCard.stamps += 1
         ↓ stamps >= stampsRequired?
         ↓ Sim
completedAt = now
RewardCode gerado (código hex aleatório)
Cliente recebe notificação WhatsApp com o código

Tipos de Prêmio

rewardTypeComportamento
free_itemAdiciona o rewardItemId à próxima comanda sem custo
percent_discountDesconto percentual (ex: 20%) na próxima visita
fixed_discountValor fixo em R$ de desconto

Endpoints Admin

MétodoRotaDescrição
GET/admin/loyalty/campaignsLista campanhas
POST/admin/loyalty/campaignsCria campanha
PUT/admin/loyalty/campaigns/:idAtualiza campanha
DELETE/admin/loyalty/campaigns/:idExclui (soft) campanha
GET/admin/loyalty/campaigns/:id/statsStats da campanha
GET/admin/loyalty/cards/:customerPhoneCartões de um cliente

Endpoints Públicos (Cliente)

MétodoRotaDescrição
GET/loyalty/campaignsCampanhas ativas
GET/loyalty/cards/:phoneCartões ativos do cliente
POST/loyalty/redeemResgatar código de prêmio

Relacionados

Lançado sob a licença MIT.