Skip to content

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 consolidados

Planos de Assinatura

PlanoDescrição
TRIAL14 dias gratuitos, todas as funcionalidades
STARTERPara clínicas com 1–5 profissionais
PROPara clínicas com 6–20 profissionais
ENTERPRISEPara 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:

  1. Valida o CNPJ (formato e dígitos verificadores)
  2. Verifica unicidade do CNPJ na plataforma
  3. Cria o registro da organização com status: TRIAL
  4. Cria o primeiro usuário com papel OWNER
  5. Retorna tokens de autenticação
  6. 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:

csharp
public interface ITenantContext
{
    Guid OrganizationId { get; }
    Guid UserId { get; }
    string Role { get; }
    Guid[] UnitIds { get; }
}

Todo repositório aplica filtro automático por OrganizationId:

csharp
// 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:

sql
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

StatusDescrição
ACTIVEOrganização ativa com plano em vigor
TRIALPeríodo de avaliação (14 dias)
SUSPENDEDPlano expirado ou pagamento pendente
CANCELLEDContrato encerrado

Organizações suspensas não podem criar novos agendamentos, mas mantêm acesso leitura.

Desenvolvido com ❤️ pela equipe FastGivr.