Skip to content

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;
}
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;
}

Lançado sob a licença MIT.