Pular para conteúdo

Arquitetura

Visão Geral

graph TB
    subgraph Cliente
        B[Browser]
    end

    subgraph Frontend
        N[Nuxt 3 SSR]
        V[Vuetify 3]
    end

    subgraph Backend
        D[Django 5]
        DRF[Django REST Framework]
        JWT[SimpleJWT]
    end

    subgraph Dados
        PG[(PostgreSQL 16)]
    end

    B --> N
    N --> V
    N -->|REST API| DRF
    DRF --> D
    D --> JWT
    D --> PG

Estrutura de Diretórios

django-nuxt-clinic/
├── backend/
│   ├── accounts/       # Usuários e autenticação
│   ├── audit/          # Logs de auditoria
│   ├── billing/        # Pagamentos
│   ├── catalog/        # Serviços oferecidos
│   ├── clinical/       # Prontuários e atendimentos
│   ├── config/         # Configurações Django
│   ├── core/           # Clínicas (multi-tenant)
│   ├── patients/       # Pacientes
│   └── scheduling/     # Agendamentos
├── frontend/
│   └── app/
│       ├── components/ # Componentes Vue
│       ├── composables/# Hooks reutilizáveis
│       ├── layouts/    # Layouts de página
│       ├── middleware/ # Middleware de autenticação
│       └── pages/      # Rotas da aplicação
├── docs/               # Esta documentação
└── docker-compose.yml

Multi-Tenancy

O sistema suporta múltiplas clínicas com isolamento de dados:

graph LR
    subgraph Clínica A
        PA[Pacientes A]
        AA[Agendamentos A]
        EA[Prontuários A]
    end

    subgraph Clínica B
        PB[Pacientes B]
        AB[Agendamentos B]
        EB[Prontuários B]
    end

    U[Usuário] -->|Header X-Clinic-ID| API
    API --> Clínica A
    API --> Clínica B

Como funciona

  1. Usuário faz login e recebe token JWT
  2. Frontend envia header X-Clinic-ID em cada request
  3. Middleware Django filtra dados pela clínica
  4. Usuário só vê dados da clínica selecionada

Fluxo de Atendimento

stateDiagram-v2
    [*] --> Agendado: Criar agendamento
    Agendado --> Confirmado: Confirmar
    Confirmado --> Aguardando: Check-in
    Aguardando --> EmAtendimento: Iniciar consulta
    EmAtendimento --> Concluido: Finalizar

    Agendado --> Cancelado: Cancelar
    Confirmado --> Cancelado: Cancelar
    Confirmado --> NaoCompareceu: Não veio

Modelo de Dados Simplificado

erDiagram
    Clinic ||--o{ User : has
    Clinic ||--o{ Patient : has
    Clinic ||--o{ Service : offers
    Clinic ||--o{ Appointment : has

    Patient ||--o{ Appointment : schedules
    User ||--o{ Appointment : attends
    Service ||--o{ Appointment : for

    Appointment ||--o| Encounter : generates
    Encounter ||--o{ Diagnosis : contains
    Encounter ||--o{ Prescription : contains