Pular para conteúdo

Data Model: Fechamento das Lacunas Pós-Migração

Existing persisted entities

Patient

  • id: UUID
  • ownerUserId: UUID; obrigatório em toda agregação
  • name: identificação mínima permitida no evento
  • status: active | inactive
  • Invariant: paciente de outro owner nunca participa de evento ou métrica.

Appointment

  • id: UUID
  • ownerUserId: UUID
  • patientId: UUID
  • startsAt: instante com timezone
  • durationMinutes: 15–480
  • timezone: timezone IANA do evento
  • status: scheduled | cancelled
  • syncStatus: estado de sincronização externa
  • Invariants: from <= startsAt < to; resposta ordenada por startsAt, depois id; cancelados não contam em consultas de hoje.

Read models

CalendarPeriod

  • from: instante inclusivo
  • to: instante exclusivo
  • timezone: timezone IANA válido
  • view: month | week
  • Validation: from < to; intervalo máximo 42 dias; instantes com offset explícito.

CalendarEvent

  • id, patientId, patientDisplayName
  • startsAt, durationMinutes, timezone
  • status, syncStatus
  • Derived: endsAt = startsAt + durationMinutes
  • Privacy: nenhum texto de prontuário, documento, CPF ou contato.

DashboardSummary

  • referenceAt: instante único usado em todos os cálculos
  • timezone: timezone IANA aplicado
  • activePatients: AvailableCountMetric
  • appointmentsToday: AvailableCountMetric
  • documentsThisMonth: CountMetric
  • monthlyRevenue: MoneyMetric

Metric state

AvailableCountMetric = { status: "available", value: non-negative integer }
UnavailableMetric = { status: "unavailable", reason: stable reason code }
MoneyMetric =
  { status: "available", valueMinor: non-negative integer, currency: ISO-4217 }
  | UnavailableMetric
CountMetric = AvailableCountMetric | UnavailableMetric
  • Initial documentsThisMonth.reason: documents_source_not_available
  • Initial monthlyRevenue.reason: revenue_source_not_available
  • Transition to available: somente após domínio persistido, auditável, especificado e aprovado.

Documented governance entity

ExternalLookupDecision

  • subject: cep | cnpj | cfp
  • decision: adopt | replace | retire
  • status: draft | approved
  • source, productValue, dataSent, dataReceived
  • privacyAndTerms, costAndQuota, availabilityAndSla
  • manualFallback, uiImpact, apiImpact
  • owner, decidedAt, reviewAt
  • Invariant: adopt ou replace não autoriza implementação; cria uma feature contratual própria.