Módulos NestJS
Arquitetura
O backend é organizado em módulos autocontidos, cada um com sua própria responsabilidade.
Módulos
Auth
Responsabilidade: Autenticação JWT e registro de usuários.
Rotas:
POST /api/auth/register- Registro global (primeiro usuário → superadmin)POST /api/auth/login- LoginGET /api/auth/me- Dados do usuário atual
Rotas por tenant:
POST /t/:slug/auth/register- Registro no tenant (primeiro → admin)POST /t/:slug/auth/login- Login no tenant
Users
Responsabilidade: Gerenciamento de usuários.
Rotas:
GET /t/:slug/users- Listar usuáriosPOST /t/:slug/users- Criar usuárioPUT /t/:slug/users/:id- Atualizar usuárioDELETE /t/:slug/users/:id- Deletar usuário
Tenants
Responsabilidade: Gerenciamento de tenants (superadmin).
Rotas:
GET /api/superadmin/tenants- Listar todosPOST /api/superadmin/tenants- CriarPUT /api/superadmin/tenants/:id- AtualizarPUT /api/superadmin/tenants/:id/toggle- Ativar/desativar
Menu
Responsabilidade: Cardápio (categorias e itens) e preços agendados.
Rotas:
GET /t/:slug/menu/categories- CategoriasPOST /t/:slug/menu/categories- Criar categoriaGET /t/:slug/menu/items- Itens (público)POST /t/:slug/menu/items- Criar item (admin)POST /t/:slug/menu/price-schedules- Criar agendamento de preçoGET /t/:slug/menu/price-schedules- Listar agendamentosPUT /t/:slug/menu/price-schedules/:id/cancel- Cancelar agendamento
Orders
Responsabilidade: Pedidos, comandas de mesa e fechamento de conta.
Rotas:
GET /t/:slug/orders- Listar pedidos (BranchScopeGuard)POST /t/:slug/orders- Criar pedido (público)GET /t/:slug/orders/open-tab/:tableId- Buscar comanda aberta de uma mesaPATCH /t/:slug/orders/:id/add-items- Adicionar itens à comandaPOST /t/:slug/orders/:id/close-tab- Fechar comanda (status → delivered). CalculanetAmountetaxSummarycom base no TaxEngine.PUT /t/:slug/orders/:id/status- Atualizar status
Reservations
Responsabilidade: Reservas de mesas.
Rotas:
GET /t/:slug/reservations- ListarPOST /t/:slug/reservations- Criar (público)PUT /t/:slug/reservations/:id- AtualizarDELETE /t/:slug/reservations/:id- Cancelar
Tables
Responsabilidade: Mesas do restaurante.
Rotas:
GET /t/:slug/tables- ListarPOST /t/:slug/tables- CriarPUT /t/:slug/tables/:id- AtualizarDELETE /t/:slug/tables/:id- Deletar
Filial (Pdvs)
Responsabilidade: Filiais e terminais PDV. Inclui autenticação por PIN, endereço da filial, usuários atribuídos e modos de serviço.
Rotas:
GET /t/:slug/pdvs- ListarPOST /t/:slug/pdvs- CriarPUT /t/:slug/pdvs/:id- AtualizarDELETE /t/:slug/pdvs/:id- DeletarGET /t/:slug/pdvs/my- Filiais do usuário atualPOST /t/:slug/pdvs/auth- Autenticação por PIN
Kitchen (WebSocket)
Responsabilidade: Display de cozinha em tempo real.
Namespace: /kitchen
Eventos:
newOrder- Novo pedidoorderStatusUpdate- Status atualizadopaymentUpdate- Resultado de pagamento Stone (server → PDV Terminal)fiscalStatusUpdate- NF-e autorizada ou rejeitada (notifica admin UI)
Stone
Localização: backend/src/stone/
Responsabilidade: Integração com gateway de pagamento Stone — autenticação OAuth2, criação de payment intents, recebimento de webhooks e emissão de resultado via WebSocket.
Componentes:
| Componente | Descrição |
|---|---|
StoneService | Cache de token OAuth2 + createPaymentIntent() + getPaymentStatus() + cancelIntent() + verifySignature() |
StoneController | POST /api/stone/webhook — rota global sem guard de tenant; valida assinatura HMAC-SHA256 e emite paymentUpdate via KitchenGateway |
Dependência circular: StoneModule ↔ OrdersModule resolvida via forwardRef() nos dois módulos.
Rotas:
POST /api/stone/webhook— global (sem prefixo/t/:slug), semJwtAuthGuard
TaxEngine
Localização: backend/src/tax-engine/
Responsabilidade: Motor de cálculo tributário com suporte ao sistema legado (ICMS/PIS/COFINS) e ao novo IBS/CBS (Reforma Tributária). Calcula impostos por item com taxas de transição faseadas.
Componentes:
| Componente | Descrição |
|---|---|
TaxEngineService | Calcula impostos por item considerando grupo fiscal, regime tributário e fase da reforma |
FiscalQueue (BullMQ)
Localização: backend/src/fiscal-queue/
Responsabilidade: Fila assíncrona para emissão de NF-e/NFC-e via BullMQ com retry exponential backoff. O processor emite notificações WebSocket (fiscalStatusUpdate) ao concluir.
Componentes:
| Componente | Descrição |
|---|---|
FiscalQueueModule | Registra a fila BullMQ e o processor |
FiscalQueueProcessor | Processa jobs de emissão e emite eventos WebSocket |
Rotas:
GET /t/:slug/fiscal/queue/stats— Métricas da fila (waiting, active, completed, failed)
NCM Lookup
Localização: backend/src/ncm-lookup/
Responsabilidade: Busca fuzzy de códigos NCM via similaridade por trigram (coeficiente de Jaccard). Contém 60+ códigos comuns para foodservice.
Rotas:
GET /t/:slug/ncm/search?q=&category=&limit=— Busca NCM por código ou descrição
Certificates
Localização: backend/src/certificates/
Responsabilidade: Upload, armazenamento (S3) e monitoramento de expiração de certificados digitais A1 (.pfx).
Componentes:
| Componente | Descrição |
|---|---|
CertificateScheduler | Cron diário às 9h — verifica certificados com expiração dentro de 30 dias e registra avisos nos limiares de 30/15/7/3/1 dias |
InboundNfe
Localização: backend/src/inbound-nfe/
Responsabilidade: Consulta e manifestação de NF-es emitidas contra o CNPJ do tenant (Manifestação do Destinatário), com processamento automático de estoque e contas a pagar.
Componentes:
| Componente | Descrição |
|---|---|
InboundNfeService | syncFromProvider(), manifest(), confirmAndProcess() |
SefazInboundProvider | Consulta nfeDistDFe (SEFAZ direto) + envio de eventos via RecepcaoEvento4 |
Rotas:
GET /t/:slug/inbound-nfe— listar com paginação/filtrosPOST /t/:slug/inbound-nfe/sync— sincronizar com providerGET /t/:slug/inbound-nfe/:id— detalhePOST /t/:slug/inbound-nfe/:id/manifest— manifestar (ciencia/confirmacao/desconhecimento/nao_realizada)DELETE /t/:slug/inbound-nfe/:id— removerGET /t/:slug/inbound-nfe/accounts-payable— listar Contas a PagarPOST /t/:slug/inbound-nfe/accounts-payable— criar AP manualPUT /t/:slug/inbound-nfe/accounts-payable/:id/pay— registrar pagamentoDELETE /t/:slug/inbound-nfe/accounts-payable/:id— cancelar AP
Schemas: InboundNfe, AccountsPayable
Dependências: BomModule (via forwardRef()), CertificatesModule, UploadModule
DRE
Localização: backend/src/dre/
Responsabilidade: Cálculo dinâmico do P&L por regime de competência. Sem schema de DRE — agrega de Order, InventoryMovement, AccountsPayable e OperatingExpense via MongoDB aggregation pipeline.
Componentes:
| Componente | Descrição |
|---|---|
DreService | computeDre() (11 etapas de agregação), CRUD de OperatingExpense, ExpenseCategory, CostCenter |
DreModule | Seed de categorias defaults no onModuleInit |
Rotas:
GET /t/:slug/dre— calcular DRE (query: year, month, costCenterId?)GET/POST /t/:slug/dre/expenses— CRUD de Despesas OperacionaisPUT/DELETE /t/:slug/dre/expenses/:idGET/POST /t/:slug/dre/categories— Plano de ContasDELETE /t/:slug/dre/categories/:idGET/POST /t/:slug/dre/cost-centers— Centros de CustoDELETE /t/:slug/dre/cost-centers/:id
Schemas: OperatingExpense, ExpenseCategory (com tenant: null para defaults), CostCenter
BOM (Fichas Técnicas)
Localização: backend/src/bom/
Responsabilidade: Cálculo de custo de produção por item do cardápio, com custos indiretos e histórico append-only de snapshots. Recálculo automático disparado por NF-e entrada ou atualização de costPrice no estoque.
Componentes:
| Componente | Descrição |
|---|---|
BomService | calculateCost(), recalculateAllForIngredients(), getSnapshotHistory() |
Rotas:
GET /t/:slug/bom— listar com custo atualGET /t/:slug/bom/:menuItemId— detalhe completoPOST /t/:slug/bom/:menuItemId/calculate— calcular (body:{ targetMargin? })GET /t/:slug/bom/:menuItemId/history— histórico de snapshotsPOST/PUT/DELETE /t/:slug/bom/indirect-costs— CRUD de custos indiretos
Schemas: BomIndirectCost, BomCostSnapshot (append-only)
Dependências: InventoryModule (via forwardRef() para trigger de recálculo)
Notifications
Localização: backend/src/notifications/
Responsabilidade: Serviço de envio de email via Nodemailer (SMTP).
Templates:
| Template | Descrição |
|---|---|
| Confirmação de pedido | Enviado ao cliente após criação do pedido |
| Pedido pronto | Notifica o cliente quando o pedido está pronto |
| Reserva | Confirmação de reserva |
| Resposta de suporte | Resposta a ticket de suporte |
| Alerta de certificado | Aviso de expiração de certificado digital |
| Convite de contador | Convite para acessar o portal do contador |