Modelo de Dados
O middag-account armazena dados de domínio usando Custom Post Types (CPTs) do WordPress com metadados em wp_postmeta. Um sistema de repositório dual suporta migração para tabelas customizadas (CCT) via toggle de feature.
Custom Post Types
Cada domínio mapeia para um CPT com o prefixo middag_. Todos os CPTs usam show_ui => false (sem UI no wp-admin) e registram capabilities customizadas.
| Domínio | Slug do CPT | Prefixo de Meta |
|---|---|---|
| Organization | middag_organization | org_ |
| Collaborator | middag_collaborator | collab_ |
| Entitlement | middag_entitlement | ent_ |
| Environment | middag_environment | env_ |
| Service | middag_service | svc_ |
| Ticket | middag_ticket | sr_ |
| Quote | middag_quote | quote_ |
| Invoice | middag_invoice | invoice_ |
| TaxInvoice | middag_tax_invoice | taxinvoice_ |
| Contract | middag_contract | contract_ |
| Document | middag_document | document_ |
Domínios Adaptadores (Sem CPT Próprio)
Esses domínios encapsulam dados existentes do WooCommerce ou de terceiros:
| Domínio | Armazenamento | Observações |
|---|---|---|
| Order | Pedidos WooCommerce | Adaptador OrderService |
| License | WC Software License | Adaptador LicenseService |
| Download | Produtos WooCommerce | Adaptador DownloadService |
| Affiliate | Registros SolidAffiliate | Adaptador AffiliateService |
Convenções de Chaves Meta
Os metadados de domínio são armazenados em wp_postmeta com chaves prefixadas. As classes de entidade aceitam tanto chaves snake_case da API quanto chaves com prefixo CCT via fromArray():
// Ambos são válidos:
$entity = EntitlementEntity::fromArray(['code' => 'PLG-2026040001']);
$entity = EntitlementEntity::fromArray(['ent_code' => 'PLG-2026040001']);Chaves Meta de Organization
| Chave Meta | Tipo | Descrição |
|---|---|---|
org_name | string | Nome de exibição |
org_legalname | string | Razão social |
org_documentnumber1 | string | CNPJ (Brasil) |
org_documentnumber2 | string | Inscrição estadual |
org_email | string | E-mail de contato principal |
org_phone | string | Telefone |
org_type | string | company ou individual |
org_verification_status | string | pending, verified |
org_stripe_customer_id_br | string | Cliente Stripe (entidade BR) |
org_stripe_customer_id_global | string | Cliente Stripe (entidade US) |
org_hubspot_company_id_br | string | Empresa HubSpot (BR) |
org_hubspot_company_id_global | string | Empresa HubSpot (US) |
Chaves Meta de Entitlement
| Chave Meta | Tipo | Descrição |
|---|---|---|
ent_code | string | Código único (PLG-2026040001) |
ent_class | string | PLG, ENV, SVC, ORD, AFL, EDU |
ent_product_name | string | Nome do produto vinculado |
ent_status | string | active, suspended, expired, cancelled |
ent_organization_id | int | Organização proprietária |
ent_company | string | middag_br ou middag_global |
ent_expires_at | string | Data de expiração (ISO 8601) |
ent_quote_id | int | Quote de origem |
ent_auto_created | bool | Provisionado automaticamente a partir de quote |
Relacionamentos
Os entitlements servem como chave estrangeira universal conectando todas as entidades downstream:
Organization (1) --> (*) Collaborator
Organization (1) --> (*) Entitlement
Entitlement (1) --> (*) License [class=PLG]
Entitlement (1) --> (*) Environment [class=ENV]
Entitlement (1) --> (*) Service [class=SVC]
Entitlement (1) --> (*) Contract
Service (1) --> (*) Ticket
Environment (1) --> (*) Ticket
Quote (1) --> (1) Order
Order (1) --> (*) Invoice
Order (1) --> (*) TaxInvoiceToggle de Repositório Dual
A opção middag_migration_complete alterna entre implementações de repositório:
| Valor da Opção | Repositório Utilizado | Armazenamento |
|---|---|---|
false | Cct{Name}Repository | Tabelas CCT JetEngine |
true | {Name}Repository | wp_posts + meta |
Ambas as implementações satisfazem a mesma {Name}RepositoryInterface definida em src/Domain/. O container DI vincula a implementação ativa no momento do boot com base no valor do toggle.
// O código de domínio desconhece o backend de armazenamento
interface EntitlementRepositoryInterface {
public function findById(int $id): ?EntitlementEntity;
public function listByOrganization(int $orgId, int $perPage, int $page): array;
}Relacionados
- Visão Geral da Arquitetura
- Glossário de Campos -- Listagem completa de campos
- Labels de Status -- Todos os valores de status