Event Storming
🎯 Clique em qualquer sticky note para ver payload, invariantes e base legal. Scroll horizontal para navegar os 7 fluxos.
Tela cheia ↗
Command
Aggregate
Policy
Ext. System
Read Model
Hotspot
Fluxo 1 — OnboardingCORE SPINE
Médico Prescritor
→
SubmitMedicalRecord
→
MedicalRecordSubmitted
→
→ Request Consent
→
MemberActivated
⚠ Receita digital vs papel?
⚠ Validade 30 dias?
⚠ Menores de idade?
Fluxo 2 — CultivoLATER MODULE
StartBatch
→
BatchStarted
→
RegisterPlant
→
PlantRegistered (ULID)
→
StageAdvanced ×N
→
HarvestRecorded
⚠ GPS: planta ou batch?
⚠ Tag: QR ou NFC?
Fluxo 3 — Processamento & LabLATER MODULE
CreateProcessingRun
→
Laboratório
→
LabSample
→
Approved ✓
|
Rejected ✗
⚠ Lab ANVISA homologado?
⚠ Reprocessamento: quantas vezes?
Fluxo 4 — InventárioCORE SPINElote manual
→ QuarantineLot
→
LotQuarantined
→
COA Aprovado?
→
LotReleased
|
LotRecalled
⚠ Prazo quarentena: RDC ou livre?
⚠ Recall: prazo ANVISA?
Fluxo 5 — DispensaçãoCORE SPINE
Quota · Receita · Lote
→
RecordDispensation
→
DispensationRecorded
+ MemberQuotaConsumed
+ LotQuantityDeducted
ASYNC →
SNGPC XML (BullMQ)
PDF recibo
Email
Atomicidade:
decide() retorna os 3 eventos em um único append no stream da Dispensation. Optimistic concurrency garante consistência sem 2PC. Side effects externos vão para fila — falha de SNGPC não invalida dispensação.
⚠ PIN ou ICP-Brasil?
⚠ Endpoint farmácia ou sandbox?
⚠ CPF em claro no XML?
Fluxo 6 — ComplianceLATER MODULEKPI básico = core
Dia 1/mês → KPI Report
15 jan/abr/jul/out → BSPO Trim
31 jan → BSPO Anual
Dia 1/mês → DRE + CPC 29
Semestral → Relatório Judicial
Fluxo 7 — LGPD AnonimizaçãoCORE SPINE
RequestAnonymization
→
Dispensações Pendentes?
→
ExecuteCryptoDeletion
→
Member
→
MemberAnonymized
→
→ LGPD Entry + Notify
Crypto-deletion (LGPD Art. 18 IV): DELETE member_key FROM Vault → name_enc, dob_enc, address_enc = lixo irrecuperável. Dado permanece fisicamente, chave não existe mais.
Chain of Custody — Timeline
Membro
Onboarding
→
Planta (ULID)
Cultivo
→
Colheita
CPC 29
→
COA + Lab
SHA-256
→
Lote
AVAILABLE
→
Dispensação
Imutável
→
SNGPC XML
ANVISA
🔒
Dispensation é imutável
Sem cancelamento. Estorno = novo evento. Audit trail permanente.
🌱
Plant ULID permanente
Nunca reutilizado, mesmo após destruição. Trilha ANVISA completa.
📋
Compliance é read-only
Nunca escreve nos aggregates. Lê projeções de todos os contextos.
⚖️
Estado regulatório é síncrono
Quota e estoque deduzem no MESMO append do
DispensationRecorded. Side effects externos (SNGPC, PDF, email) vão para BullMQ — falha não compromete dispensação.🛡️
Audit imutável no banco
PostgreSQL RULE bloqueia UPDATE/DELETE. Não confia na app layer.
🔑
Crypto-deletion ≠ DELETE
Dado permanece. Chave desaparece. LGPD Art. 18 IV via destruição de chave.