Tipos de Negócio
Visão Geral
O campo businessType no schema de Tenant controla quais funcionalidades ficam visíveis e ativas para cada estabelecimento. Isso permite que a mesma plataforma atenda restaurantes, mercados e padarias sem criar caminhos de código completamente separados.
Schema (Mongoose):
businessType?: 'restaurant' | 'mercado' | 'padaria';O campo é opcional. Quando ausente (undefined), o sistema assume 'restaurant' por retrocompatibilidade.
Tipos Disponíveis
| Valor | Ícone | Descrição | Padrão |
|---|---|---|---|
restaurant | 🍽️ | Restaurante tradicional — mesas, reservas, cozinha | ✅ (default) |
mercado | 🏪 | Mercado / varejo — auto-atendimento e balcão, sem mesas | — |
padaria | 🥐 | Padaria / confeitaria — balcão e auto-atendimento, sem reservas | — |
Feature Gates
A lógica é centralizada em uma única expressão reutilizada em vários pontos:
const isRestaurant = !tenant?.businessType || tenant.businessType === 'restaurant';| Funcionalidade | restaurant | mercado | padaria |
|---|---|---|---|
| Seção "Mesas" no painel admin | ✅ | ❌ | ❌ |
| Seção "Reservas" no painel admin | ✅ | ❌ | ❌ |
| Display de Cozinha (Kitchen View) | ✅ | ❌ | ❌ |
| Prompt de número de mesa no MenuView | ✅ | ❌ | ❌ |
Opção dine_in no CheckoutView | ✅ | ❌ | ❌ |
| Modo "Mesa" no PDV terminal | ✅ | ❌ | ❌ |
| Modo "Auto-atendimento" no PDV | ✅ | ✅ | ✅ |
| Modo "Balcão" no PDV | ✅ | ✅ | ✅ |
Compatibilidade Retroativa
Tenants criados antes da implementação do campo businessType terão o campo como undefined. O padrão adotado garante que esses tenants continuem funcionando como restaurantes sem nenhuma migração de dados:
// undefined → trata como 'restaurant' (compatível com dados legados)
const isRestaurant = !tenant?.businessType || tenant.businessType === 'restaurant';Não usar:
// ❌ Falha para tenants legados (undefined !== 'restaurant')
const isRestaurant = tenant?.businessType === 'restaurant';Locais de Aplicação
O isRestaurant check deve ser aplicado em:
- Frontend — AdminLayout: ocultar itens de nav (Mesas, Reservas, Cozinha)
- Frontend — MenuView: ocultar campo "Número da mesa"
- Frontend — CheckoutView: ocultar opção
dine_inno tipo de entrega - Frontend — PdvTerminalView: ocultar modo "Mesa" na seleção de modo
A verificação é feita com o tenant carregado via useTenantStore() ou equivalente.
Definição no Backend
Campo no schema Tenant:
@Prop({ default: undefined })
businessType?: string;DTOs de criação e edição expõem o campo como opcional:
@IsOptional()
@IsString()
businessType?: string;A validação de valores aceitos (restaurant | mercado | padaria) é feita no frontend — o backend aceita qualquer string para permitir extensibilidade futura sem deploy obrigatório.