Skip to content

REF-501-07: Affiliate Domain Spec

ADR: ADR-501 — Service DeliveryEscopo: Affiliate entity fields, status lifecycle, transitions, Entitlement AFL, hooks Relacionado: REF-901-07 — SolidAffiliate Integration (hooks consumidos, adapter, API endpoints)


1. Purpose

Rastrear Organizations que participam do programa de afiliados. O domínio Affiliate é a representação interna — SolidAffiliate (plugin externo) é a fonte de verdade para dados de afiliados (ADR-103). middag-account persiste apenas o Entitlement AFL e o estado do afiliado.

Dependência: Plugin SolidAffiliate instalado e ativo. Se ausente, domínio Affiliate desabilitado inteiramente (ADR-103).


2. Entity Fields

CampoTipoDescrição
organization_idint (FK)Organization participante do programa
solid_affiliate_idint (nullable)ID no SolidAffiliate (preenchido após aprovação)
referral_codestring (unique)Código de indicação único
statusenumPENDING | ACTIVE | SUSPENDED | TERMINATED
commission_ratedecimal(5,4)Taxa de comissão (ex: 0.1000 = 10%)
total_earneddecimal(10,2)Total acumulado de comissões
activated_atdatetime (nullable)Data de ativação
terminated_atdatetime (nullable)Data de encerramento definitivo

3. Status Lifecycle

PENDING ──────► ACTIVE ──────► SUSPENDED
   │              │                │
   │              │                │
   │              ▼                ▼
   │          TERMINATED ◄──── TERMINATED
   │              ▲
   │              │
   └──────────────┘ (admin rejeita = TERMINATED direto)

Transitions

DeParaGatilho
PENDINGACTIVEAdmin aprova
PENDINGTERMINATEDAdmin rejeita
ACTIVESUSPENDEDAdmin suspende OU SolidAffiliate webhook
SUSPENDEDACTIVEAdmin reativa
ACTIVETERMINATEDEncerramento permanente (admin)
SUSPENDEDTERMINATEDEncerramento permanente (admin)

TERMINATED é estado final — nenhuma transição permitida a partir dele.


4. Entitlement AFL

Quando Affiliate status = ACTIVE, um Entitlement classe AFL é criado/ativado automaticamente:

  • Código: AFL-{YYYY}{MM}{SEQ:4d} (ex: AFL-202604-0001)
  • Vinculado à Organization do afiliado
  • Status do Entitlement segue status do Affiliate:
    • Affiliate ACTIVE → Entitlement ACTIVE
    • Affiliate SUSPENDED → Entitlement SUSPENDED
    • Affiliate TERMINATED → Entitlement CANCELLED

Detalhes do modelo Entitlement em ADR-202 e REF-202-01.


5. Hooks Disparados

HookQuandoPayload
middag_affiliate_activatedPENDING → ACTIVE$organization_id, $affiliate
middag_affiliate_suspendedACTIVE → SUSPENDED$organization_id, $reason
middag_affiliate_reactivatedSUSPENDED → ACTIVE$organization_id
middag_affiliate_terminated* → TERMINATED$organization_id, $reason

6. Open Questions

  • Créditos de afiliado têm validade (expiram)? Comissões acumuladas em total_earned — verificar se há prazo de resgate.
  • Self-registration? Hoje admin aprova manualmente. Avaliar fluxo de auto-registro no portal.