Tenants e Organizações
O que é um Tenant?
No SystemClinic, cada clínica cadastrada é um tenant — uma organização isolada com seus próprios dados, usuários e configurações. O isolamento é total: nenhum dado de um tenant é visível para outro.
Estrutura de Multi-tenant
Organização (Tenant)
├── Unidade 1 (São Paulo - Centro)
│ ├── Usuários vinculados
│ ├── Profissionais disponíveis
│ ├── Salas de atendimento
│ └── Agendamentos
├── Unidade 2 (São Paulo - Pinheiros)
│ ├── Usuários vinculados
│ ├── Profissionais disponíveis
│ └── Agendamentos
└── Dados compartilhados entre unidades
├── Pacientes
├── Procedimentos e preços
├── Convênios
└── Relatórios consolidadosPlanos de Assinatura
| Plano | Descrição |
|---|---|
TRIAL | 14 dias gratuitos, todas as funcionalidades |
STARTER | Para clínicas com 1–5 profissionais |
PRO | Para clínicas com 6–20 profissionais |
ENTERPRISE | Para redes com 20+ profissionais ou múltiplas unidades |
Durante o Trial, todas as funcionalidades estão disponíveis sem limitação. Ao expirar, a organização entra em modo suspenso e não consegue criar novos agendamentos.
Onboarding de Nova Clínica
O fluxo de cadastro de uma nova organização:
POST /registration/clinic
{
"clinicName": "Clínica Estética Bella",
"cnpj": "12.345.678/0001-90",
"email": "admin@clinicabella.com.br",
"phone": "(11) 99999-9999",
"adminName": "Maria Silva",
"adminPassword": "Senha@123"
}O sistema:
- Valida o CNPJ (formato e dígitos verificadores)
- Verifica unicidade do CNPJ na plataforma
- Cria o registro da organização com
status: TRIAL - Cria o primeiro usuário com papel
OWNER - Retorna tokens de autenticação
- O painel fica disponível imediatamente
Gerenciar Múltiplas Unidades
Cada organização pode ter N unidades independentes.
Configurações por Unidade
Cada unidade possui configurações próprias:
- Endereço completo (rua, número, cidade, estado, CEP, geolocalização)
- Telefone de contato
- Horário de funcionamento por dia da semana com suporte a múltiplos turnos
- Feriados e bloqueios de agenda específicos da unidade
Vinculação de Usuários e Profissionais
Ao convidar um usuário ou cadastrar um profissional, defina em quais unidades ele pode atuar via unit_ids[]. Um profissional pode atuar em múltiplas unidades com grades de disponibilidade diferentes por unidade.
Isolamento de Dados
O isolamento é garantido em múltiplas camadas:
Camada de API (.NET)
O ITenantContext é populado pelo JwtBearerMiddleware em toda requisição:
public interface ITenantContext
{
Guid OrganizationId { get; }
Guid UserId { get; }
string Role { get; }
Guid[] UnitIds { get; }
}Todo repositório aplica filtro automático por OrganizationId:
// Global Query Filter no EF Core
modelBuilder.Entity<Patient>()
.HasQueryFilter(p => p.OrganizationId == _tenantContext.OrganizationId);Camada de Banco de Dados
Row-Level Security (RLS) no PostgreSQL garante isolamento mesmo em caso de falha no filtro da aplicação:
CREATE POLICY tenant_isolation ON patients
USING (organization_id = current_setting('app.current_org_id')::uuid);Camada de Armazenamento (Firebase Storage)
Arquivos são organizados por organizationId no path:
/{organizationId}/{context}/{fileName}A API valida o organizationId antes de gerar qualquer Signed URL.
Configurações da Organização
Em Configurações → Clínica:
- Nome e dados da clínica
- Logo personalizado
- CNPJ e e-mail de contato
- Configurações de marca (cores — planejado para V1)
- Subdomínio personalizado (planejado para V1)
Estado da Organização
| Status | Descrição |
|---|---|
ACTIVE | Organização ativa com plano em vigor |
TRIAL | Período de avaliação (14 dias) |
SUSPENDED | Plano expirado ou pagamento pendente |
CANCELLED | Contrato encerrado |
Organizações suspensas não podem criar novos agendamentos, mas mantêm acesso leitura.