Skip to content

Diagrama de Classes

Lucas Christian edited this page Jun 3, 2026 · 7 revisions
classDiagram
    direction TB

    %% =========================
    %% Base comum das entidades
    %% =========================
    class BaseEntity {
        <<abstract>>
        UUID id
        String createdBy
        Instant createdAt
        String lastModifiedBy
        Instant lastModifiedAt
        Long version
    }

    %% =========================
    %% Organização
    %% =========================
    class Organizacao {
        String nome
        String emailContato
        String telefoneContato
        byte[] logotipoImagem
        String logotipoContentType
        String corPrimaria
        Boolean ativo
    }

    class Unidade {
        UUID organizacaoId
        String nome
        String telefone
        Boolean ativo
    }

    class Endereco {
        <<Embeddable>>
        String logradouro
        String numero
        String bairro
        String cidade
        String uf
        String cep
        String complemento
    }

    class Consultorio {
        UUID unidadeId
        String nome
        String numeroSala
        Boolean ativo
    }

    %% =========================
    %% Usuários e perfis
    %% =========================
    class Usuario {
        UUID organizacaoId
        String keycloakId
        PerfilUsuario perfil
        Boolean ativo
    }

    class Paciente {
        UUID usuarioId
        LocalDate dataNascimento
        String observacoes
    }

    class Medico {
        UUID usuarioId
        Boolean ativo
    }

    class Especialidade {
        String nome
        String descricao
        Boolean ativo
    }

    class MedicoEspecialidade {
        UUID medicoId
        UUID especialidadeId
    }

    %% =========================
    %% Agenda
    %% =========================
    class AlocacaoMedico {
        UUID medicoId
        UUID consultorioId
        LocalDate dataInicio
        LocalDate dataFim
        Boolean ativo
    }

    class AgendaMedica {
        UUID alocacaoMedicoId
        DayOfWeek diaSemana
        LocalTime horaInicio
        LocalTime horaFim
        Integer duracaoConsultaMinutos
        Boolean ativo
    }

    class BloqueioAgenda {
        UUID medicoId
        UUID consultorioId
        LocalDateTime inicio
        LocalDateTime fim
        String motivo
        TipoBloqueioAgenda tipo
    }

    %% =========================
    %% Consulta e atendimento
    %% =========================
    class Consulta {
        UUID pacienteId
        UUID medicoId
        UUID consultorioId
        UUID alocacaoMedicoId
        UUID canceladoPorId
        LocalDateTime dataHoraInicio
        LocalDateTime dataHoraFim
        StatusConsulta status
        String tipoConsulta
        String motivo
        String observacaoCancelamento
        LocalDateTime canceladoEm
    }

    class RegistroAtendimento {
        UUID consultaId
        UUID medicoId
        LocalDateTime dataRegistro
        String queixaPrincipal
        String anamnese
        String conduta
        String observacoes
    }

    class AnexoConsulta {
        UUID consultaId
        String nomeArquivo
        String contentType
        Long tamanhoBytes
        byte[] conteudo
        String descricao
    }

    %% =========================
    %% Enums
    %% =========================
    class PerfilUsuario {
        <<Enumeration>>
        ADMINISTRADOR
        RECEPCIONISTA
        MEDICO
        PACIENTE
    }

    class StatusConsulta {
        <<Enumeration>>
        AGENDADA
        CONFIRMADA
        EM_ESPERA
        EM_ATENDIMENTO
        FINALIZADA
        CANCELADA
        NAO_COMPARECEU
    }

    class TipoBloqueioAgenda {
        <<Enumeration>>
        PAUSA
        FERIAS
        INDISPONIBILIDADE
        OUTRO
    }

    %% =========================
    %% Organização
    %% =========================
    Organizacao "1" *-- "0..*" Unidade : possui
    Organizacao "1" --> "0..*" Usuario : usuarios
    Unidade "1" *-- "1" Endereco : endereco
    Unidade "1" *-- "0..*" Consultorio : consultorios

    %% =========================
    %% Perfis de usuário
    %% =========================
    Usuario "1" --> "0..1" Paciente : dadosPaciente
    Usuario "1" --> "0..1" Medico : dadosMedico

    %% =========================
    %% Especialidades médicas
    %% =========================
    Medico "1" --> "0..*" MedicoEspecialidade : especialidades
    Especialidade "1" --> "0..*" MedicoEspecialidade : medicos

    %% =========================
    %% Alocação e agenda
    %% =========================
    Medico "1" --> "0..*" AlocacaoMedico : alocacoes
    Consultorio "1" --> "0..*" AlocacaoMedico : alocacoes
    AlocacaoMedico "1" --> "0..*" AgendaMedica : agendas

    Medico "1" --> "0..*" BloqueioAgenda : bloqueios
    Consultorio "1" --> "0..*" BloqueioAgenda : bloqueios

    %% =========================
    %% Consulta
    %% =========================
    Paciente "1" --> "0..*" Consulta : consultas
    Medico "1" --> "0..*" Consulta : consultas
    Consultorio "1" --> "0..*" Consulta : consultas
    AlocacaoMedico "1" --> "0..*" Consulta : origemAgenda
    Usuario "1" --> "0..*" Consulta : canceladoPor

    Consulta "1" *-- "0..1" RegistroAtendimento : registro
    Medico "1" --> "0..*" RegistroAtendimento : registros

    Consulta "1" *-- "0..*" AnexoConsulta : anexos
Loading

Clone this wiki locally