Skip to content

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ínioSlug do CPTPrefixo de Meta
Organizationmiddag_organizationorg_
Collaboratormiddag_collaboratorcollab_
Entitlementmiddag_entitlementent_
Environmentmiddag_environmentenv_
Servicemiddag_servicesvc_
Ticketmiddag_ticketsr_
Quotemiddag_quotequote_
Invoicemiddag_invoiceinvoice_
TaxInvoicemiddag_tax_invoicetaxinvoice_
Contractmiddag_contractcontract_
Documentmiddag_documentdocument_

Domínios Adaptadores (Sem CPT Próprio)

Esses domínios encapsulam dados existentes do WooCommerce ou de terceiros:

DomínioArmazenamentoObservações
OrderPedidos WooCommerceAdaptador OrderService
LicenseWC Software LicenseAdaptador LicenseService
DownloadProdutos WooCommerceAdaptador DownloadService
AffiliateRegistros SolidAffiliateAdaptador 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():

php
// Ambos são válidos:
$entity = EntitlementEntity::fromArray(['code' => 'PLG-2026040001']);
$entity = EntitlementEntity::fromArray(['ent_code' => 'PLG-2026040001']);

Chaves Meta de Organization

Chave MetaTipoDescrição
org_namestringNome de exibição
org_legalnamestringRazão social
org_documentnumber1stringCNPJ (Brasil)
org_documentnumber2stringInscrição estadual
org_emailstringE-mail de contato principal
org_phonestringTelefone
org_typestringcompany ou individual
org_verification_statusstringpending, verified
org_stripe_customer_id_brstringCliente Stripe (entidade BR)
org_stripe_customer_id_globalstringCliente Stripe (entidade US)
org_hubspot_company_id_brstringEmpresa HubSpot (BR)
org_hubspot_company_id_globalstringEmpresa HubSpot (US)

Chaves Meta de Entitlement

Chave MetaTipoDescrição
ent_codestringCódigo único (PLG-2026040001)
ent_classstringPLG, ENV, SVC, ORD, AFL, EDU
ent_product_namestringNome do produto vinculado
ent_statusstringactive, suspended, expired, cancelled
ent_organization_idintOrganização proprietária
ent_companystringmiddag_br ou middag_global
ent_expires_atstringData de expiração (ISO 8601)
ent_quote_idintQuote de origem
ent_auto_createdboolProvisionado 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) --> (*) TaxInvoice

Toggle de Repositório Dual

A opção middag_migration_complete alterna entre implementações de repositório:

Valor da OpçãoRepositório UtilizadoArmazenamento
falseCct{Name}RepositoryTabelas CCT JetEngine
true{Name}Repositorywp_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.

php
// 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