Promotional representa uma promoção configurada por uma Company. Ele centraliza os dados comuns de catálogo, desconto, período de validade e status. A validação específica fica em uma tabela de regra fixa, conforme o type.
Campos
| Campo | Tipo | Descrição |
|---|---|---|
promotionalId | UUID | Identificador único |
organizationId | UUID | Organização da Company responsável pela promoção |
companyId | UUID | Company dona da promoção |
code | String | Código legível único da promoção |
name | String | Nome interno da promoção |
description | String? | Descrição interna da campanha |
displayTitle | String | Título exibido para o cliente no catálogo |
displayDescription | String? | Texto curto exibido para o cliente antes do checkout |
callToActionLabel | String? | Texto do CTA exibido no front |
type | PromotionalType | Tipo fixo da promoção |
discountType | PromotionalDiscountType | Forma de cálculo do desconto |
discountValue | Int | Valor do desconto em centavos ou basis points, conforme discountType |
maxDiscountAmount | Int? | Teto de desconto em centavos, quando aplicável |
allowedChannels | String[] | Canais onde a promoção pode aparecer ou ser aplicada |
stackable | Boolean | Indica se pode combinar com outros descontos |
priority | Int | Prioridade de exibição e desempate |
startsAt | DateTime? | Início da validade da promoção |
endsAt | DateTime? | Fim da validade da promoção |
status | PromotionalStatus | Status da promoção |
createdBy | UUID? | Usuário que criou o registro, quando aplicável |
createdAt | DateTime | Data de criação |
updatedBy | UUID? | Usuário que fez a última atualização, quando aplicável |
updatedAt | DateTime | Data da última atualização |
deletedBy | UUID? | Usuário que removeu o registro, quando aplicável |
deletedAt | DateTime? | Data de remoção lógica |
Relacionamentos
- Relaciona-se com Organization por
organizationId. - Relaciona-se com Company por
companyId. - Relaciona-se com PromotionalRouteRule, quando
type = ROUTE. - Relaciona-se com PromotionalRoundTripRule, quando
type = ROUND_TRIP. - Relaciona-se com PromotionalMultiTicketRule, quando
type = MULTI_TICKET. - Relaciona-se com PromotionalLowDemandTimeRule, quando
type = LOW_DEMAND_TIME. - Relaciona-se com múltiplos PromotionalUsageHistory.
Regras de Negócio
- A promoção pertence à Company indicada em
companyIde só pode ser aplicada em compras da mesma Company. typedefine qual tabela de regra deve existir para validar a promoção.- Cada promoção deve ter exatamente uma regra ativa compatível com o
type. - Uma promoção
ROUTEdeve ter uma PromotionalRouteRule. - Uma promoção
ROUND_TRIPdeve ter uma PromotionalRoundTripRule. - Uma promoção
MULTI_TICKETdeve ter uma PromotionalMultiTicketRule. - Uma promoção
LOW_DEMAND_TIMEdeve ter uma PromotionalLowDemandTimeRule. - O front pode exibir a promoção usando os campos de catálogo e a regra fixa correspondente, antes de o carrinho estar completo.
- Exibir uma promoção no catálogo não garante aplicação; a aplicação depende da validação final no checkout.
discountValueusa centavos quandodiscountType = FIXED_AMOUNTe basis points quandodiscountType = PERCENTAGE.maxDiscountAmountlimita o desconto percentual quando preenchido.allowedChannelscontrola se a promoção aparece em canais como app, web, agência ou venda assistida.priorityordena a exibição e resolve conflitos quando múltiplas promoções elegíveis disputam o mesmo contexto.- Se
stackable = false, a promoção não pode ser combinada com outro desconto aplicado ao mesmo item de compra. - Promoções ativas devem respeitar
startsAt,endsAt,status, Company, canal e a regra fixa correspondente. - Cada aplicação confirmada deve gerar um PromotionalUsageHistory.
createdBy,updatedByedeletedByseguem o padrão de auditoria do DEVMOB e registram o usuário responsável pela mutação, quando aplicável.
Enums
PromotionalType
| Valor | Descrição |
|---|---|
ROUND_TRIP | Incentivo para compra de ida e volta |
MULTI_TICKET | Desconto por quantidade de passagens |
ROUTE | Promoção específica por rota |
LOW_DEMAND_TIME | Incentivo para horários de menor demanda |
PromotionalDiscountType
| Valor | Descrição |
|---|---|
PERCENTAGE | Desconto percentual em basis points |
FIXED_AMOUNT | Desconto fixo em centavos |
PromotionalStatus
| Valor | Descrição |
|---|---|
DRAFT | Promoção em rascunho |
ACTIVE | Promoção ativa |
INACTIVE | Promoção inativa manualmente |
EXPIRED | Promoção encerrada por validade |