Pular para o conteúdo

Event Storming

🎯 Clique em qualquer sticky note para ver payload, invariantes e base legal. Scroll horizontal para navegar os 7 fluxos. Tela cheia ↗
Domain Event
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.