Modelos de Dados MongoDB
Visão Geral
O sistema utiliza MongoDB como banco de dados. Todos os documentos possuem timestamps automáticos (createdAt, updatedAt).
Collections
Tenant
typescript
interface Tenant {
name: string; // Nome do restaurante
slug: string; // Identificador único na URL
email: string; // Email de contato
primaryColor: string; // Cor primária (hex)
secondaryColor?: string;
plan: 'free' | 'basic' | 'premium';
isActive: boolean;
createdAt: Date;
updatedAt: Date;
}Índice único: { slug: 1 }
User
typescript
interface User {
email: string;
password: string; // Hash bcrypt
name: string;
role: 'customer' | 'staff' | 'admin' | 'superadmin';
tenant?: ObjectId; // Referência para Tenant (exceto superadmin)
createdAt: Date;
updatedAt: Date;
}Índice único: { email: 1, tenant: 1 }
Category
typescript
interface Category {
name: string;
order: number; // Ordem de exibição
isActive: boolean;
tenant: ObjectId;
createdAt: Date;
updatedAt: Date;
}MenuItem
typescript
interface MenuItem {
name: string;
description?: string;
price: number;
image?: string;
category: ObjectId;
preparationTime?: number; // Em minutos
isAvailable: boolean;
tenant: ObjectId;
createdAt: Date;
updatedAt: Date;
}Order
typescript
interface Order {
orderNumber: string; // Formato: YYYYMMDD-XXXX
items: Array<{
menuItem: ObjectId;
quantity: number;
unitPrice: number;
notes?: string;
}>;
customerName: string;
customerPhone: string;
customerEmail?: string;
orderType: 'dine_in' | 'takeout';
table?: ObjectId;
status: 'pending' | 'confirmed' | 'preparing' | 'ready' | 'delivered' | 'cancelled';
total: number;
tenant: ObjectId;
createdAt: Date;
updatedAt: Date;
}Table
typescript
interface Table {
number: number;
capacity: number;
status: 'available' | 'occupied' | 'reserved';
tenant: ObjectId;
createdAt: Date;
updatedAt: Date;
}Reservation
typescript
interface Reservation {
customerName: string;
customerPhone: string;
customerEmail?: string;
date: Date;
time: string;
partySize: number;
table?: ObjectId;
status: 'pending' | 'confirmed' | 'cancelled';
notes?: string;
tenant: ObjectId;
createdAt: Date;
updatedAt: Date;
}InventoryItem
typescript
interface InventoryItem {
name: string;
sku: string;
currentStock: number;
minStock: number;
unit: string;
cost: number;
expirationDate?: Date;
status: 'active' | 'inactive';
tenant: ObjectId;
createdAt: Date;
updatedAt: Date;
}Filial
typescript
interface Pdv {
name: string;
slug: string;
serviceMode: 'mesa' | 'balcao' | 'auto_atendimento';
location?: string;
isActive: boolean;
tenant: ObjectId;
createdAt: Date;
updatedAt: Date;
}