Contexto
Produto próprio, desenvolvido para explorar a arquitetura de um SaaS: várias empresas na mesma instalação, cada uma com seus dados, permissões e identidade visual.
Problema
Em um sistema multiempresa, um único filtro esquecido numa consulta pode expor dados de um cliente para outro. O isolamento não pode depender da atenção de quem escreve cada tela.
Solução
Banco único com a coluna discriminadora empresa_id. Um middleware resolve a empresa ativa de cada requisição e uma trait aplica um escopo global a todos os modelos de tenant: toda consulta já sai filtrada e todo registro novo recebe a empresa certa. Vazar dados exigiria remover o escopo de propósito.
O que fiz
  • Arquitetura multi-tenant (middleware, trait com escopo global, helper da empresa ativa).
  • Organização em módulos independentes: Core, Clientes, Agendamentos, Orçamentos, Estoque e Financeiro.
  • Numeração de documentos independente por empresa e por ano.
  • Papéis e permissões, geração de orçamentos em PDF e identidade visual por empresa (white-label).
Tecnologias
  • Laravel 12
  • PHP
  • MySQL 8
  • laravel-modules
  • spatie/permission
  • DomPDF
  • Tailwind CSS
  • Docker
Estado
Código aberto no GitHub. Sem demonstração online.

Como funciona

A ideia, em um diagrama.

Ilustração do funcionamento descrito no projeto, não uma tela do sistema.

Diagrama: um grupo empresarial com duas empresas; cada consulta passa pelo escopo global e só enxerga os dados da própria empresa. grupo empresarial empresa A empresa B escopo global: where empresa_id = ativa clientes orçamentos estoque clientes orçamentos estoque

Contato

Tem um problema concreto? Vamos conversar.

Projetos de software, experiências em realidade virtual, palestras e oficinas. Respondo pelo canal que for mais prático para você.