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.