Skip to content

Diagrama de Classes

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

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

    %% =========================
    %% Sistema externo de identidade/autorização
    %% =========================
    class Keycloak {
        <<external>>
        String sub
        String username
        String firstName
        String lastName
        String email
        String telefone
        String cpf
        LocalDate dataNascimento
        Boolean enabled
        Roles roles
        Permissions permissions
    }

    %% =========================
    %% 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ário interno e vínculo com Keycloak
    %% =========================
    class Usuario {
        UUID organizacaoId
        String keycloakId
        Boolean ativo
    }

    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 usuarioPacienteId
        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
        String queixaPrincipal
        String anamnese
        String conduta
        String observacoes
    }

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

    %% =========================
    %% Enums
    %% =========================
    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

    %% =========================
    %% Integração com Keycloak
    %% =========================
    Keycloak "1" ..> "0..*" Usuario : sub/keycloakId

    %% =========================
    %% Usuários de domínio
    %% =========================
    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
    %% =========================
    Usuario "1" --> "0..*" Consulta : consultasComoPaciente
    Medico "1" --> "0..*" Consulta : consultasComoMedico
    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