O NexarGrid utiliza o SurrealDB como sua principal fonte de persistência de dados. O SurrealDB é um banco de dados multi-modelo inovador que combina capacidades de banco de dados relacional, documento e grafo, permitindo uma modelagem de dados flexível e poderosa.
# Visão Geral
A escolha do SurrealDB foi motivada pela necessidade de lidar com relacionamentos complexos entre entidades (como escalas, turnos, profissionais e regras de pagamento) de forma eficiente, sem a rigidez de um esquema relacional tradicional, mas com garantias de consistência superiores às de bancos NoSQL puramente baseados em documentos.
# Características Principais
Multi-modelo: Suporta tabelas (como SQL), documentos (como MongoDB) e arestas de grafo (como Neo4j) simultaneamente.
Schemafull/Schemaless: Permite definir esquemas estritos para entidades críticas (como User e ShiftPack) enquanto mantém flexibilidade para outras.
Real-time: Suporte nativo a Live Queries via WebSocket, fundamental para a atualização em tempo real do Grid de escalas.
# Catálogo de Entidades
Abaixo detalhamos as principais entidades do sistema, agrupadas por domínio funcional.
# 1. Núcleo (Core)
Entidades fundamentais para o funcionamento do sistema, gestão de acesso e estrutura organizacional.
# User (Usuário)
Representa os usuários do sistema administrativo (gestores, coordenadores, administradores).
Collection: user
Campos Principais:
name (string, required): Nome completo.
email (string, required, unique): E-mail para login.
phone (string, required): Telefone de contato.
roles (array): Lista de permissões/papéis.
projects (array): Projetos aos quais o usuário tem acesso.
active (boolean): Status da conta.
# Client (Cliente)
Representa as organizações clientes (hospitais, clínicas) que contratam os serviços.
Collection: client
Campos Principais:
name (string, required): Razão social ou nome fantasia.
erpId (string, unique): Identificador no sistema ERP legado.
contactDetails (object): Dados de contato (email, telefone, endereço).
projects (array): Lista de projetos vinculados.
# Project (Projeto)
Unidade de negócio ou centro de custo dentro de um cliente (ex: “UTI Adulto”, “Emergência Pediátrica”).
Collection: project
Campos Principais:
name (string, required): Nome do projeto.
clientId (string, required): Referência ao cliente.
businessUnit (string): Unidade de negócio.
status (enum): active, inactive, archived.
complianceRules (array): Regras de compliance específicas do projeto.
# 2. Gestão de Escalas (Scheduling)
Entidades responsáveis pela definição, planejamento e execução das escalas de trabalho.
# Grid (Grade)
A configuração macro de uma escala, definindo regras, períodos e estrutura.
Collection: grid
Campos Principais:
name (string, required): Nome da escala (ex: “Escala Outubro 2025”).
projectId (string, required): Projeto ao qual pertence.
startDate / endDate (datetime): Período de vigência.
slotStartTime / slotEndTime (string): Horários padrão de início e fim dos turnos.
shiftPacks (array): IDs dos pacotes de turnos vinculados.
status (string): Estado atual (active, locked, etc.).
# ShiftPack (Pacote de Turnos)
Agrupamento lógico de turnos, geralmente representando uma linha de plantão ou uma posição na escala.
Collection: shiftPack
Campos Principais:
name (string, required): Nome do pacote (ex: “Segunda Diurno”).
position (number): Ordem de exibição na grade.
gridId (string, required): Grade pai.
slots (array): Referências aos ShiftItems (slots) contidos neste pacote.
status (enum): active, inactive, archived.
# ShiftItem (Item de Turno / Slot)
A menor unidade de planejamento. Representa um “buraco” na escala que precisa ser preenchido por um profissional.
Collection: shiftItem
Campos Principais:
shiftPackId (string, required): Pacote pai.
date (string, required): Data do turno (YYYY-MM-DD).
startTime / endTime (string): Horário específico.
rosteredId (string): ID do profissional alocado (se houver).
status (enum): open, filled, blocked, published.
isExtra (boolean): Indica se é um turno extra fora da grade padrão.
# CalendarGrid (Item Publicado)
Representa um turno efetivamente publicado e visível para o profissional. É o resultado da “materialização” de um ShiftItem preenchido.
Collection: calendarGrid
Campos Principais:
rosteredId (string): Profissional alocado.
startDate / endDate (datetime): Data/hora completas de início e fim.
status (string): scheduled, confirmed, completed.
payment (object): Dados calculados de pagamento (ver seção Financeiro).
attendance (object): Dados de check-in/check-out reais.
# 3. Gestão de Profissionais (People)
# Rostered (Profissional / Escalado)
Profissional de saúde (médico, enfermeiro, etc.) elegível para assumir turnos.
Collection: rostered
Campos Principais:
name (string, required): Nome completo.
specialty (array): Especialidades e níveis de proficiência.
documentation (object): CRMs, certificados e validade.
geoLocation (object): Coordenadas para funcionalidades baseadas em localização.
availabilityRestrictions (object): Bloqueios de agenda (férias, licenças).
relationships (array): Vínculos com projetos e status de contratação.
# 4. Financeiro e Regras (Financial)
# PaymentRule (Regra de Pagamento)
Define como os turnos devem ser remunerados com base em critérios complexos.
Collection: paymentRule
Campos Principais:
gridId / projectId: Escopo da regra.
rules (object): Contém as definições para diferentes regimes:
hourly: Pagamento por hora.
competence: Pagamento por competência/turno fechado.
clt: Regras para regime CLT.
Cada regra define: rate (valor), days (dias da semana aplicáveis), periods (faixas horárias) e tag (função).
# Collision (Colisão)
Registro de conflitos ou violações de regras detectados pelo sistema.
Collection: collision
Campos Principais:
rosteredId (string): Profissional envolvido.
shiftItemId (string): Turno onde ocorreu o conflito.
ruleId (string): Regra violada.
severity (enum): warning (aviso), block (impedimento).
message (string): Descrição legível do conflito.
# Diagrama de Relacionamentos (ER Simplificado)
O SurrealDB permite a definição de índices para otimizar consultas frequentes. No NexarGrid, utilizamos índices estratégicos em campos como:
email e cpf em User e Rostered para buscas rápidas de identidade.
projectId e status em Grid para listagens de dashboard.
startDate e endDate em CalendarGrid para consultas de intervalo de tempo.
rosteredId em ShiftItem para verificar disponibilidade e conflitos.