v beta-2.0.1 Released

Banco de Dados e Modelo de Dados

05 de janeiro de 2026
beta-2.0.1
Time Técnico NexarSystems

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)

                  possui

                  contém

                  organiza

                  agrupa

                  alocado em

                  realiza

                  gera (ao publicar)

                  define

                  usa

                  gerencia

                  Client

                  Project

                  Grid

                  ShiftPack

                  ShiftItem

                  Rostered

                  CalendarGrid

                  PaymentRule

                  User

                  # Índices e Performance

                  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.