Pular para o conteúdo

Catálogo de Domain Events

Todos os eventos são imutáveis após emissão. Armazenados no event_log (append-only, sem UPDATE/DELETE via PostgreSQL RULE). Identificados por ULID.

interface DomainEvent {
id: string; // ULID
type: string; // event name
aggregateId: string; // ULID of the aggregate
occurredAt: Date; // UTC
version: number; // aggregate version
payload: Record<string, unknown>;
}

CampoTipoDescrição
member_idULIDIdentificador do membro
cpf_hashstringSHA-256 + site_salt
consent_versionstringVersão do termo LGPD aceito
quota_g_monthnumberQuota mensal inicial em gramas

Dispara: criação do prontuário criptografado; notificação ao RESPONSAVEL_TECNICO.


CampoTipoDescrição
member_idULID
revoked_atDateUTC
reasonstringMEMBER_REQUEST | MEDICAL_REVOCATION

Dispara: suspensão imediata de dispensações pendentes; início do processo de crypto-deletion.


CampoTipoDescrição
member_idULID
expired_atDateData de expiração da prescrição

Dispara: transição do membro para SUSPENDED; notificação ao responsável técnico.


CampoTipoDescrição
member_idULID
old_quota_gnumberQuota anterior
new_quota_gnumberNova quota
updated_byULIDuser_id do RESPONSAVEL_TECNICO

Dispara: recalculo de saldo disponível no mês corrente.


CampoTipoDescrição
member_idULID
reasonstringMEDICAL_RECORD_EXPIRED | COMPLIANCE_FLAG | ADMIN_ACTION
suspended_byULIDuser_id

Dispara: bloqueio de novas dispensações; registro no audit log.


CampoTipoDescrição
member_idULID
anonymized_atDateUTC

Dispara: crypto-deletion da member_key; substituição de EncryptedPersonalData por tombstone. Irreversível.


QuotaExceededAttempt é evento do contexto Dispensation (nasce da tentativa de dispensar), não Membership. Ver definição canônica em Dispensation abaixo.


CampoTipoDescrição
batch_idULID
strainstringCultivar/strain
started_byULIDuser_id do CULTIVADOR
location_encryptedstringGeolocalização cifrada AES-256-GCM

Dispara: criação do registro de lote no sistema; notificação ao RESPONSAVEL_TECNICO.


CampoTipoDescrição
plant_idULIDPermanente — nunca reutilizado
batch_idULID
stagestringGERMINATING (inicial)

Dispara: registro no inventário de plantas vivas.


CampoTipoDescrição
plant_idULID
from_stagestringEstágio anterior
to_stagestringNovo estágio
advanced_byULIDuser_id

Dispara: atualização do estado da planta; log de progressão.


CampoTipoDescrição
plant_idULID
reasonstringMotivo da destruição
witness_user_idULIDTestemunha obrigatória
destroyed_atDateUTC

Dispara: remoção do inventário ativo; registro permanente no audit log.


CampoTipoDescrição
batch_idULID
harvest_gnumberMassa colhida em gramas
fair_value_brlstringDecimal(15,2) — CPC 29
harvested_byULIDuser_id

Dispara: criação de HarvestBatch em Processing; criação de BiologicalAssetValuation em Finance.


CampoTipoDescrição
batch_idULID
total_plantsnumber
total_harvest_gnumber
closed_byULIDuser_id

Dispara: encerramento do ciclo de cultivo; dados disponíveis para BSPO.


CampoTipoDescrição
run_idULID
harvest_batch_idULID
input_gnumber
output_gnumber
yield_pctnumberCalculado: output_g / input_g

Dispara: criação de LabSample para análise; notificação ao RESPONSAVEL_TECNICO.


CampoTipoDescrição
sample_idULID
run_idULID
coa_file_hashstringSHA-256 do arquivo COA
lab_namestringLaboratório acreditado

Dispara: aguarda aprovação/rejeição pelo RESPONSAVEL_TECNICO.


CampoTipoDescrição
sample_idULID
thc_pctnumber
cbd_pctnumber
contaminants_passboolean
approved_byULIDDeve ter role RESPONSAVEL_TECNICO

Dispara: transição do InventoryLot de QUARANTINE para AVAILABLE.


CampoTipoDescrição
sample_idULID
reasonstringMotivo da rejeição
rejected_byULIDuser_id RESPONSAVEL_TECNICO

Dispara: bloqueio do InventoryLot até nova amostra; notificação ao CULTIVADOR.


CampoTipoDescrição
lot_idULID
harvest_batch_idULID
quantity_gnumber

Dispara: criação do lote em estado QUARANTINE; aguarda LabSampleApproved.


CampoTipoDescrição
lot_idULID
released_byULIDuser_id RESPONSAVEL_TECNICO
released_atDateUTC

Dispara: lote disponível para dispensação; atualização do estoque disponível.


CampoTipoDescrição
lot_idULID
exhausted_atDateUTC

Dispara: remoção do lote do estoque ativo; registro para BSPO.


CampoTipoDescrição
lot_idULID
reasonstringMotivo do recall
recalled_byULIDuser_id

Dispara: bloqueio imediato de dispensações; notificação de urgência ao RESPONSAVEL_TECNICO e ADMIN. Estado terminal — irreversível.


Fato da entrega — emitido no mesmo append de MemberQuotaConsumed + LotQuantityDeducted. Cf. ADR-001.

CampoTipoDescrição
dispensation_idULID
member_refULIDCross-context ref para Membership
inventory_lot_refULIDCross-context ref para Inventory
quantity_gnumber
dispensed_byULIDuser_id DISPENSADOR
dispensed_atDateUTC
prescription_refULIDPrescrição vigente no momento da dispensação
approved_byULID | nullApprover (preenchido se via MCP two-step approval)

Dispara (síncrono, mesmo append): MemberQuotaConsumed + LotQuantityDeducted. Dispara (BullMQ async): geração de XML SNGPC, PDF recibo, email notificação.


Fato da quota — projetado pelo read model member_quota. Emitido junto com DispensationRecorded em um único append.

CampoTipoDescrição
member_idULID
dispensation_idULIDEvento que originou o consumo
monthstringYYYY-MM — janela de quota
quantity_gnumberQuantidade consumida
quota_before_gnumberSaldo antes da consumação
quota_after_gnumberSaldo após — invariante: ≥ 0
consumed_byULIDuser_id DISPENSADOR
occurred_atDateUTC

Invariante: quota_after_g === quota_before_g - quantity_g e quota_after_g ≥ 0. Violado → decide() rejeita com QuotaExceededAttempt.


Fato do estoque — projetado pelo read model inventory_lot. Emitido junto com DispensationRecorded.

CampoTipoDescrição
lot_idULID
dispensation_idULIDEvento que originou a dedução
quantity_gnumberQuantidade deduzida
quantity_before_gnumberSaldo antes
quantity_after_gnumberSaldo após — invariante: ≥ 0
deducted_byULIDuser_id DISPENSADOR
occurred_atDateUTC

Invariante: quantity_after_g === quantity_before_g - quantity_g e quantity_after_g ≥ 0. Violado → decide() rejeita com LotInsufficientQuantity. Concorrência protegida por optimistic concurrency no stream do lote (ver ADR-001 spike gate).


Tentativa registrada de dispensar acima da quota. Não altera estado — serve como evidência de bloqueio para auditoria + alerta DPO/RT.

CampoTipoDescrição
member_idULID
attempted_quantity_gnumber
quota_remaining_gnumber
attempted_byULIDuser_id DISPENSADOR
attempted_atDateUTC

Tentativa registrada de dispensar acima do estoque disponível do lote.

CampoTipoDescrição
lot_idULID
attempted_quantity_gnumber
lot_remaining_gnumber
attempted_byULIDuser_id DISPENSADOR
attempted_atDateUTC

CampoTipoDescrição
dispensation_idULID
xml_hashstringSHA-256 do XML gerado
generated_atDateUTC

Dispara: envio ao servidor SNGPC ANVISA.


CampoTipoDescrição
dispensation_idULID
anvisa_protocolstringProtocolo de confirmação ANVISA
sent_atDateUTC

Dispara: marcação como transmitido; registro no Compliance.


CampoTipoDescrição
dispensation_idULID
error_codestringCódigo de erro ANVISA
attemptnumberNúmero da tentativa (max 3)

Dispara: requeue com backoff exponencial (BullMQ); alerta ao RESPONSAVEL_TECNICO após 3 falhas.


CampoTipoDescrição
report_idULID
periodstringQ1/2026, ANUAL/2026 etc.
file_hashstringSHA-256 do PDF/XML gerado
signed_byULIDuser_id RESPONSAVEL_TECNICO

Dispara: disponibilização para envio ANVISA; registro de auditoria.


CampoTipoDescrição
report_idULID
period_startDate
period_endDate
kpi_countnumber7 indicadores

Dispara: disponibilização no dashboard de Compliance.


CampoTipoDescrição
batch_idULID
dispensation_countnumber
anvisa_protocolstring

Dispara: marcação em massa de dispensações como transmitidas.


CampoTipoDescrição
report_idULID
monthstringYYYY-MM
file_hashstringSHA-256

Dispara: disponibilização para o contexto Finance.


CampoTipoDescrição
report_idULID
member_refULIDMembro solicitante (se aplicável)
generated_byULIDuser_id RESPONSAVEL_TECNICO

Dispara: disponibilização para download seguro; log de auditoria.


CampoTipoDescrição
valuation_idULID
harvest_batch_idULID
fair_value_brlstringDecimal(15,2) — CPC 29 / IAS 41
valued_atDateUTC

Dispara: atualização do balanço patrimonial; input para DRE do mês.


CampoTipoDescrição
statement_idULID
monthstringYYYY-MM
revenue_brlstringDecimal(15,2)
expenses_brlstringDecimal(15,2)
result_brlstringDecimal(15,2)

Dispara: publicação no dashboard Finance; input para BSPO anual.


CampoTipoDescrição
record_idULID
member_refULID
amount_brlstringDecimal(15,2)
reference_monthstringYYYY-MM

Dispara: atualização do DRE do mês; rastreabilidade por membro.


CampoTipoDescrição
user_idULID
rolestringRole inicial
created_byULIDuser_id ADMIN

Dispara: envio de convite por e-mail; obrigação de configurar TOTP (roles críticos).


CampoTipoDescrição
user_idULID
old_rolestring
new_rolestring
changed_byULIDuser_id ADMIN

Dispara: invalidação imediata de todas as sessões ativas do usuário.


CampoTipoDescrição
user_idULID
ipstringIP de origem (anonimizado)
totp_usedboolean

Dispara: registro no audit log; atualização de last_login_at.


CampoTipoDescrição
user_idULID | nullnull se usuário não encontrado
ipstring
attemptnumberContador de falhas consecutivas

Dispara: bloqueio temporário após 5 tentativas; alerta ao ADMIN após 10.


CampoTipoDescrição
user_idULID
enabled_atDateUTC

Dispara: liberação de acesso completo para roles críticos (RESPONSAVEL_TECNICO, DISPENSADOR).