Skip to content

REF-301-01: Dual-Entity Routing Rules

ADR: ADR-301 — Commerce: Quote, Order, Invoice, TaxInvoiceEscopo: Árvore de decisão de roteamento, campos da Organization, product channels block, override admin, regras de Services


1. Árvore de Decisão

Evento de compra (Quote aceito / Order criada)

├── Produto tem atribuição explícita de entidade?
│   ├── SIM → Usar entidade atribuída pelo produto
│   └── NÃO → Usar billing_entity da Organization

├── Organization tem billing_entity definido?
│   ├── SIM → Rotear para essa entidade
│   └── NÃO → Determinar a partir dos dados do cliente:
│       ├── Tem CNPJ? → MIDDAG BR
│       ├── Tem EIN/VAT/outro tax ID internacional? → MIDDAG GLOBAL
│       └── Sem tax ID? → Usar preferred_currency:
│           ├── BRL → MIDDAG BR
│           └── USD → MIDDAG GLOBAL

├── Override: Admin pode definir manualmente entidade por transação

└── Exceção: Services são SEMPRE MIDDAG BR (v5.0)

2. Campos da Organization

CampoTipoDescrição
billing_entityenummiddag_br / middag_global / null (auto-detect)
preferred_currencyenumBRL / USD — fallback para roteamento e exibição
stripe_customer_id_brstringCustomer ID na conta Stripe BR (pagamentos BRL)
stripe_customer_id_globalstringCustomer ID na conta Stripe GLOBAL (pagamentos USD)
hubspot_company_id_brstringCompany ID no HubSpot BR
hubspot_company_id_globalstringCompany ID no HubSpot GLOBAL
tax_idstringCNPJ, EIN, VAT — formato livre
tax_id_typestringLabel do tipo (CNPJ, EIN, VAT, custom)

Nota: Organization pode ter AMBOS os Stripe customer IDs (raro: org que compra da BR E da LLC).


3. Product Channels Block

Cada produto define quais contas Stripe (e outros canais) estao habilitadas via channels block:

yaml
channels:
  stripe_br:
    enabled: true      # Sincroniza com Stripe BR (BRL)
  stripe_global:
    enabled: false     # Stripe US desabilitado
Channel ConfigSignificadoExemplo
channels.stripe_br.enabledSincroniza apenas com Stripe BR (BRL)Planos Services, hospedagem gerenciada
channels.stripe_global.enabledSincroniza apenas com Stripe US (USD)Plugins vendidos internacionalmente

Nota: O campo sync.stripe.entity foi removido. O channels block e a unica fonte de verdade para roteamento de entidade.


4. O Que Cada Entidade Lida

CapacidadeMIDDAG BRMIDDAG GLOBAL
PluginsSim (BRL)Sim (USD) — prioridade
SaaS (Campus EAD)Sim (mercado BR)Futuro (internacional)
ServicesSim (sempre)Raro (caso a caso, toggle)
Pagamento: StripeSim (Stripe BR)Sim (Stripe US)
Pagamento: Banco InterSim (Pix, Boleto)Não
Fiscal: NFSeSim (ISSNet, Brasília/DF)Não
Fiscal: InvoiceStripe InvoiceStripe Invoice
CRM: HubSpotSim (instância BR)Sim (instância LLC)
MoedaBRLUSD

5. Override Admin

CenárioComportamento
Admin define entidade em QuoteOverride para todas as transações desse Quote
Admin define entidade em OrderOverride pontual para essa Order
Conflito produto vs orgProduto vence (tag explícita)
Sem tag no produto, sem billing_entityAuto-detect por tax ID / moeda preferencial

6. Regra de Services

Services são SEMPRE MIDDAG BR na v5.0.

Justificativa: serviços profissionais são operação brasileira. LLC para serviços é caso a caso e desabilitado por default. Toggle admin permite habilitar Services via LLC se necessário no futuro.


7. Filosofia de Configuração

Tudo pode existir tanto na BR quanto na LLC. Limites são configuráveis no WP, não hardcoded.

ConfiguraçãoDefaultConfigurável
LLC vende serviçosDesabilitadoToggle admin
LLC vende SaaSDesabilitadoToggle admin
BR cobra em USDDesabilitadoToggle admin (raro)
Atribuição de entidade no produtoAuto (da org)Override por produto