Dados
Modelo relacional commerce-vc1
PostgreSQL 16 · 76 tabelas em 14 schemas . Cada revenda é um tenant (reseller_id); valores monetários em centavos (inteiros). Trilha de auditoria append-only e anexos sensíveis em storage privado (LGPD).
DDL canônico: schema.dbml · explicações: 04-DATABASE.md
💡
O que isso significa para você
Os diagramas mostram o que a plataforma guarda — não é SQL para rodar. A base comum (revenda, login, arquivos, auditoria) aparece embaixo; o fluxo comercial vai da tabela de preços até fatura e NF.
Visão geral dos schemas
Fluxo de negócio (esquerda → direita). FKs fortes entre áreas; base transversal sem “espaguete” de setas.
Abrir em tamanho real
Relações principais (linguagem simples)
Revenda → clientes: cada cliente final pertence a uma revenda; assinatura congela o plano vendido.
Proposta → contrato: o funil gera snapshot imutável; contrato assinado amarra assinatura e linha telefônica.
Uso → fatura: ligações tarifadas no ciclo mensal viram linhas de fatura congeladas; repasse só no modo VC1 fatura.
Fatura → NFCom: documento fiscal referencia a fatura; tentativas de API ficam no log.
Carteira pré-paga: saldo e movimentos são append-only — ajuste é novo lançamento, não edição.
Preços VC1 e faixas (pricing) Livro de preços VC1, faixas e clones por revenda.
Preços VC1 e faixas. FK internas e refs tracejadas.Abrir em tamanho real pricing.price_base_version_rows — IMMUTABLE snapshot of unit rates. CHECK min_commitment_cents > 0; CHECK rates >=Coluna Tipo id PK uuid price_base_version_id → pricing.price_base_versions.id uuid vc1_tier_id → pricing.vc1_tiers.id uuid min_commitment_centsbigint unit_did_centsbigint unit_channel_centsbigint unit_landline_cents_per_minnumeric(12,4) unit_mobile_cents_per_minnumeric(12,4) fidelity_default_monthsint created_attimestamptz
pricing.price_base_versions — IMMUTABLE after published_at. No updated_at. CHECK cadence 30/6 on parent.Coluna Tipo id PK uuid price_base_id → pricing.price_bases.id uuid version_numberint effective_fromtimestamptz effective_untiltimestamptz published_attimestamptz published_by_user_id → identity.users.id uuid change_reasontext created_attimestamptz
pricing.price_bases — VC1 price book. Versions are immutable; editor always inserts a new version.Coluna Tipo id PK uuid namevarchar(128) codevarchar(32) cadence_min_sint cadence_inc_sint is_activeboolean created_attimestamptz updated_attimestamptz deleted_attimestamptz
pricing.reseller_tier_rows — Reseller may edit row-by-row after clone. Selling below cost sets below_cost=truColuna Tipo id PK uuid reseller_id → pricing.reseller_tier_tables.id uuid reseller_tier_table_id → pricing.reseller_tier_tables.id uuid vc1_tier_id → pricing.vc1_tiers.id uuid source_version_row_id → pricing.price_base_version_rows.id uuid markup_pctnumeric(8,4) unit_did_centsbigint unit_channel_centsbigint unit_landline_cents_per_minnumeric(12,4) unit_mobile_cents_per_minnumeric(12,4) min_commitment_centsbigint below_costboolean created_attimestamptz updated_attimestamptz
pricing.reseller_tier_tablesColuna Tipo id PK uuid reseller_id → tenancy.resellers.id uuid source_price_base_version_id → pricing.price_base_versions.id uuid markup_pctnumeric(8,4) is_currentboolean created_attimestamptz updated_attimestamptz deleted_attimestamptz
pricing.vc1_tiers — Stable band identity. Rates live on price_base_version_rows. locked_tier_id poinColuna Tipo id PK uuid price_base_id → pricing.price_bases.id uuid codevarchar(32) namevarchar(128) sort_orderint created_attimestamptz deleted_attimestamptz
Planos comerciais (catalog) Planos comerciais, destinos e pacotes sugeridos.
Planos comerciais. FK internas e refs tracejadas.Abrir em tamanho real catalog.destinationsColuna Tipo code PK destination namevarchar(64) is_billableboolean blocked_by_defaultboolean created_attimestamptz
catalog.plan_quotas — CHECK separate ⇒ total=0 and (landline+mobile)>=0; pooled ⇒ total>0 and landlineColuna Tipo id PK uuid reseller_id → catalog.plan_versions.id uuid plan_version_id → catalog.plan_versions.id uuid included_didsint included_channelsint franchise_modeplan_franchise_mode franchise_landline_secondsint franchise_mobile_secondsint franchise_total_secondsint created_attimestamptz
catalog.plan_trial_rules — Reseller defines trial per plan. duration_days=0 AND enabled=false ⇒ no trial.Coluna Tipo id PK uuid reseller_id → catalog.plan_versions.id uuid plan_version_id → catalog.plan_versions.id uuid enabledboolean duration_daysint franchise_landline_secondsint franchise_mobile_secondsint franchise_total_secondsint included_didsint included_channelsint created_attimestamptz
catalog.plan_versions — IMMUTABLE. CHECK kind=package ⇒ sell_price_cents NOT NULL AND franchise_mode NOTColuna Tipo id PK uuid reseller_id → pricing.reseller_tier_rows.id uuid plan_id → catalog.plans.id uuid version_numberint kindplan_kind franchise_modeplan_franchise_mode overage_policyplan_overage_policy payment_modepayment_mode sell_price_centsbigint commitment_centsbigint locked_tier_id → pricing.vc1_tiers.id uuid reseller_tier_row_id → pricing.reseller_tier_rows.id uuid unit_did_centsbigint unit_channel_centsbigint unit_landline_cents_per_minnumeric(12,4) unit_mobile_cents_per_minnumeric(12,4) overage_landline_cents_per_minnumeric(12,4) overage_mobile_cents_per_minnumeric(12,4) cost_did_centsbigint cost_channel_centsbigint cost_landline_cents_per_minnumeric(12,4) cost_mobile_cents_per_minnumeric(12,4) fidelity_monthsint below_costboolean snapshotjsonb published_attimestamptz created_attimestamptz
catalog.plans — Head entity. Commercial fields live on plan_versions (immutable).Coluna Tipo id PK uuid reseller_id → catalog.plan_versions.id uuid suggested_package_id → catalog.suggested_packages.id uuid codevarchar(64) namevarchar(128) kindplan_kind is_activeboolean current_version_id → catalog.plan_versions.id uuid negative_margin_acknowledged_attimestamptz created_attimestamptz updated_attimestamptz deleted_attimestamptz
catalog.suggested_packages — VC1-owned templates. Clone copies into catalog.plans with reseller_id set.Coluna Tipo id PK uuid codevarchar(32) namevarchar(128) descriptiontext kindplan_kind templatejsonb is_activeboolean created_attimestamptz updated_attimestamptz deleted_attimestamptz
Funil e contratos (sales) Funil comercial, propostas, trials e contratos.
Funil e contratos. FK internas e refs tracejadas.Abrir em tamanho real sales.contracts — Replaces public.sales as the signed commercial artifact. Attestation lives on siColuna Tipo id PK uuid reseller_id → customers.subscriptions.id uuid proposal_id → sales.proposals.id uuid customer_id → customers.customers.id uuid subscription_id → customers.subscriptions.id uuid statuscontract_status issuerinvoice_issuer snapshotjsonb effective_attimestamptz signed_attimestamptz cancelled_attimestamptz created_attimestamptz updated_attimestamptz deleted_attimestamptz
sales.proposal_events — Append-only. No updated_at / deleted_at.Coluna Tipo id PK uuid reseller_id → sales.proposals.id uuid proposal_id → sales.proposals.id uuid event_typevarchar(64) payloadjsonb actor_typevarchar(20) actor_user_id → identity.users.id uuid created_attimestamptz
sales.proposal_items — Line snapshot at emit. Frozen with parent snapshot jsonb.Coluna Tipo id PK uuid reseller_id → sales.proposals.id uuid proposal_id → sales.proposals.id uuid kindinvoice_line_kind quantityint unit_sell_centsbigint unit_cost_centsbigint labelvarchar(255) metadatajsonb created_attimestamptz
sales.proposals — Fork of public.proposals. Totals NEVER trusted from the browser — snapshot is seColuna Tipo id PK uuid reseller_id → catalog.plan_versions.id uuid customer_id → customers.customers.id uuid seller_user_id → identity.users.id uuid public_codevarchar(80) proposal_numbervarchar(32) stageproposal_stage kanban_columnkanban_column profile_typeprofile_type documentvarchar(14) legal_namevarchar(255) contact_namevarchar(255) contact_emailvarchar(255) contact_phonevarchar(20) plan_id → catalog.plans.id uuid plan_version_id → catalog.plan_versions.id uuid payment_modepayment_mode snapshotjsonb public_access_usernamevarchar(32) public_access_password_hashvarchar(255) public_access_attemptssmallint public_access_blocked_untiltimestamptz pin_hashvarchar(255) views_countint viewed_attimestamptz sent_attimestamptz accepted_attimestamptz expires_attimestamptz contracted_attimestamptz lost_reasontext created_attimestamptz updated_attimestamptz deleted_attimestamptz
sales.signature_envelopesColuna Tipo id PK uuid reseller_id → sales.contracts.id uuid contract_id → sales.contracts.id uuid mesign_envelope_idvarchar(64) document_sha256varchar(64) statusvarchar(32) sign_urltext webhook_last_eventvarchar(64) completed_attimestamptz archived_attimestamptz created_attimestamptz updated_attimestamptz
sales.trialsColuna Tipo id PK uuid reseller_id → catalog.plans.id uuid proposal_id → sales.proposals.id uuid customer_id → customers.customers.id uuid subscription_id → customers.subscriptions.id uuid plan_id → catalog.plans.id uuid plan_version_id → catalog.plan_versions.id uuid statustrial_status starts_attimestamptz ends_attimestamptz franchise_landline_secondsint franchise_mobile_secondsint converted_attimestamptz created_attimestamptz updated_attimestamptz
Clientes finais (customers) Clientes finais, assinaturas e portabilidade.
Clientes finais. FK internas e refs tracejadas.Abrir em tamanho real customers.addressesColuna Tipo id PK uuid reseller_id → customers.customers.id uuid customer_id → customers.customers.id uuid kindvarchar(16) zipvarchar(8) streetvarchar(255) numbervarchar(32) complementvarchar(128) neighborhoodvarchar(128) cityvarchar(128) statechar(2) ibge_city_codevarchar(7) is_primaryboolean created_attimestamptz updated_attimestamptz deleted_attimestamptz
customers.contacts — Replaces sales-mework360 people + customer_people (one person per role per custoColuna Tipo id PK uuid reseller_id → customers.customers.id uuid customer_id → customers.customers.id uuid rolecontact_role full_namevarchar(255) emailvarchar(255) phonevarchar(20) documentvarchar(11) created_attimestamptz updated_attimestamptz deleted_attimestamptz
customers.customer_usersColuna Tipo id PK uuid reseller_id → customers.customers.id uuid customer_id → customers.customers.id uuid user_id → identity.users.id uuid is_adminboolean created_attimestamptz deleted_attimestamptz
customers.customers — kind=reseller_self is the reseller own-usage subscriber used in VC1 minimum aggrColuna Tipo id PK uuid reseller_id → sales.proposals.id uuid kindcustomer_kind statuscustomer_status profile_typeprofile_type legal_namevarchar(255) trade_namevarchar(255) documentvarchar(14) emailvarchar(255) phonevarchar(20) payment_modepayment_mode legacy_org_idbigint legacy_tronco_idbigint source_proposal_id → sales.proposals.id uuid created_attimestamptz updated_attimestamptz deleted_attimestamptz
customers.portability_filesColuna Tipo id PK uuid reseller_id → customers.portability_requests.id uuid customer_id → customers.customers.id uuid portability_request_id → customers.portability_requests.id uuid file_id → files.objects.id uuid retained_untildate created_attimestamptz deleted_attimestamptz
customers.portability_requestsColuna Tipo id PK uuid reseller_id → customers.subscriptions.id uuid customer_id → customers.customers.id uuid subscription_id → customers.subscriptions.id uuid numbersjsonb [not null, default: `' donor_operatorvarchar(128) statusvarchar(32) legacy_portability_idbigint submitted_attimestamptz completed_attimestamptz created_attimestamptz updated_attimestamptz deleted_attimestamptz
customers.subscriptions — did_count/channel_count are denormalized live totals; source of truth is telco.dColuna Tipo id PK uuid reseller_id → catalog.plan_versions.id uuid customer_id → customers.customers.id uuid plan_id → catalog.plans.id uuid plan_version_id → catalog.plan_versions.id uuid statussubscription_status payment_modepayment_mode overage_landline_cents_per_minnumeric(12,4) overage_mobile_cents_per_minnumeric(12,4) did_countint channel_countint trial_ends_attimestamptz started_attimestamptz cancelled_attimestamptz cancel_reasontext created_attimestamptz updated_attimestamptz deleted_attimestamptz
Linha telefônica (SIP/DID) (telco) Contas SIP, DIDs, canais e bloqueios de originação.
Linha telefônica (SIP/DID). FK internas e refs tracejadas.Abrir em tamanho real telco.block_events — Append-only audit of TelcoPort blockSubscriber / alterar_status_boqueio.Coluna Tipo id PK uuid reseller_id → telco.sip_accounts.id uuid subscription_id → customers.subscriptions.id uuid sip_account_id → telco.sip_accounts.id uuid reasonblock_reason actionvarchar(16) actor_user_id → identity.users.id uuid connector_call_id → integration.connector_calls.id uuid created_attimestamptz
telco.channel_allocations — Current simultaneous call limit. History in channel_changes.Coluna Tipo id PK uuid reseller_id → telco.sip_accounts.id uuid subscription_id → customers.subscriptions.id uuid sip_account_id → telco.sip_accounts.id uuid quantityint effective_fromdate created_attimestamptz updated_attimestamptz
telco.channel_changes — Append-only. Mid-cycle adds bill remaining days / days_in_cycle.Coluna Tipo id PK uuid reseller_id → customers.subscriptions.id uuid subscription_id → customers.subscriptions.id uuid kindchannel_change_kind from_quantityint to_quantityint effective_ondate pro_rataboolean actor_user_id → identity.users.id uuid created_attimestamptz
telco.didsColuna Tipo id PK uuid reseller_id → customers.portability_requests.id uuid subscription_id → customers.subscriptions.id uuid customer_id → customers.customers.id uuid e164varchar(16) cityvarchar(128) area_codevarchar(4) activated_atdate deactivated_atdate legacy_did_idbigint portability_request_id → customers.portability_requests.id uuid created_attimestamptz updated_attimestamptz deleted_attimestamptz
telco.sip_accounts — Mirror of SipPulse subscriber. Password never stored (ProvisioningPort / generatColuna Tipo id PK uuid reseller_id → customers.customers.id uuid subscription_id → customers.subscriptions.id uuid customer_id → customers.customers.id uuid familysip_family usernamevarchar(64) sip_domainvarchar(255) accountcodevarchar(128) call_limitint legacy_rate_plan_idint legacy_subscriber_refvarchar(128) blocked_attimestamptz block_reasonblock_reason created_attimestamptz updated_attimestamptz deleted_attimestamptz
Tarificação de ligações (rating) Ciclos, CDR, prefixos e chamadas tarifadas.
Tarificação de ligações. FK internas e refs tracejadas.Abrir em tamanho real rating.cdr_importsColuna Tipo id PK uuid reseller_id → tenancy.resellers.id uuid sourcevarchar(32) cursor_after_idbigint cursor_after_timetimestamptz rows_readint rows_ratedint rows_skippedint started_attimestamptz finished_attimestamptz errortext created_attimestamptz
rating.cycles — Calendar month America/Sao_Paulo [period_start, period_end) for all resellers (DColuna Tipo id PK uuid reseller_id → tenancy.resellers.id uuid period_startdate period_enddate statuscycle_status closed_attimestamptz created_attimestamptz updated_attimestamptz
rating.destination_prefixes — Classifies B-number into landline_br / mobile_br / other. Prefix list A VERIFICAColuna Tipo id PK uuid prefixvarchar(16) destinationdestination country_iso2char(2) descriptionvarchar(128) created_attimestamptz deleted_attimestamptz
rating.rated_calls — PARTITION BY RANGE (started_at) monthly. IMMUTABLE (append-only). Commercial ratColuna Tipo iduuid reseller_id → rating.cycles.id uuid subscription_id → customers.subscriptions.id uuid customer_id → customers.customers.id uuid sip_account_id → telco.sip_accounts.id uuid cycle_id → rating.cycles.id uuid usage_record_iduuid started_attimestamptz legacy_cdr_idbigint accountcodevarchar(128) source_numbervarchar(32) destination_numbervarchar(32) destinationdestination raw_secondsint billed_secondsint sell_rate_cents_per_minnumeric(12,4) cost_rate_cents_per_minnumeric(12,4) sell_amount_centsnumeric(14,4) cost_amount_centsnumeric(14,4) switch_price_centsbigint switch_durationint switch_duration_blockint service_typevarchar(64) rated_attimestamptz created_attimestamptz
rating.usage_records — PARTITION BY RANGE (period_start) monthly. Grain: one row per subscription × desColuna Tipo iduuid reseller_id → rating.cycles.id uuid subscription_id → customers.subscriptions.id uuid customer_id → customers.customers.id uuid cycle_id → rating.cycles.id uuid destinationdestination period_startdate raw_secondsbigint billed_secondsbigint call_countint sell_centsbigint cost_centsbigint franchise_seconds_appliedbigint overage_secondsbigint created_attimestamptz updated_attimestamptz
Faturamento (billing) Crédito, faturas, repasses e ciclo de cobrança.
Faturamento. FK internas e refs tracejadas.Abrir em tamanho real billing.commission_invoices — NF of commission issued BY the reseller TO VC1. Blocks payout until received.Coluna Tipo id PK uuid reseller_id → billing.payouts.id uuid payout_id → billing.payouts.id uuid numbervarchar(64) amount_centsbigint file_id → files.objects.id uuid received_attimestamptz created_attimestamptz updated_attimestamptz
billing.credit_ledger — Append-only. No UPDATE/DELETE. Unique idempotency prevents double debit of a CDRColuna Tipo id PK uuid reseller_id → customers.customers.id uuid wallet_id → billing.credit_wallets.id uuid customer_id → customers.customers.id uuid entry_typeledger_entry_type amount_centsnumeric(14,4) unrecovered_centsnumeric(14,4) balance_after_centsnumeric(14,4) source_typevarchar(32) source_iduuid idempotency_keyvarchar(128) created_attimestamptz
billing.credit_limits — Postpaid only. Exposure = DIDs+channels+minutes in the open cycle.Coluna Tipo id PK uuid reseller_id → customers.subscriptions.id uuid customer_id → customers.customers.id uuid subscription_id → customers.subscriptions.id uuid limit_centsbigint alert_percentsmallint block_percentsmallint created_attimestamptz updated_attimestamptz deleted_attimestamptz
billing.credit_wallets — Prepaid SoT. CHECK balance_cents >= 0. Concurrency: SELECT ... FOR UPDATE (D-DB-Coluna Tipo id PK uuid reseller_id → customers.subscriptions.id uuid customer_id → customers.customers.id uuid subscription_id → customers.subscriptions.id uuid balance_centsnumeric(14,4) versionint created_attimestamptz updated_attimestamptz
billing.cycle_runsColuna Tipo id PK uuid reseller_id → rating.cycles.id uuid cycle_id → rating.cycles.id uuid phasevarchar(32) statusvarchar(16) started_attimestamptz finished_attimestamptz statsjsonb errortext created_attimestamptz
billing.dunning_eventsColuna Tipo id PK uuid reseller_id → billing.invoices.id uuid invoice_id → billing.invoices.id uuid kinddunning_kind payloadjsonb fired_attimestamptz created_attimestamptz
billing.invoice_lines — IMMUTABLE. No updated_at. Insert-only; corrections via credit invoice.Coluna Tipo id PK uuid reseller_id → billing.invoices.id uuid invoice_id → billing.invoices.id uuid kindinvoice_line_kind descriptionvarchar(255) quantitynumeric(14,4) unit_sell_centsbigint amount_centsbigint cost_centsbigint destinationdestination snapshotjsonb created_attimestamptz
billing.invoices — CHECK NOT (party=customer AND issuer=reseller). party=customer + issuer=vc1 whenColuna Tipo id PK uuid reseller_id → customers.subscriptions.id uuid cycle_id → rating.cycles.id uuid partyinvoice_party customer_id → customers.customers.id uuid subscription_id → customers.subscriptions.id uuid issuerinvoice_issuer statusinvoice_status numbervarchar(32) subtotal_centsbigint commitment_centsbigint charged_centsbigint cost_centsbigint margin_centsbigint due_ondate issued_attimestamptz paid_attimestamptz cancelled_attimestamptz mepay_invoice_idvarchar(64) mepay_charge_idvarchar(64) payment_link_urltext replaces_invoice_iduuid snapshotjsonb created_attimestamptz updated_attimestamptz deleted_attimestamptz
billing.limit_events — Append-only. Alert at 80% (reseller+VC1), block at 100%.Coluna Tipo id PK uuid reseller_id → customers.subscriptions.id uuid credit_limit_id → billing.credit_limits.id uuid subscription_id → customers.subscriptions.id uuid threshold_percentsmallint actionlimit_action exposure_centsbigint limit_centsbigint fired_attimestamptz created_attimestamptz
billing.payment_methodsColuna Tipo id PK uuid reseller_id → customers.customers.id uuid partyinvoice_party customer_id → customers.customers.id uuid kindpayment_method_kind mepay_refvarchar(64) labelvarchar(128) is_defaultboolean created_attimestamptz updated_attimestamptz deleted_attimestamptz
billing.payments — Only invoices actually paid count toward payout margin and (PADRÃO PROPOSTO) resColuna Tipo id PK uuid reseller_id → billing.payment_methods.id uuid invoice_id → billing.invoices.id uuid payment_method_id → billing.payment_methods.id uuid amount_centsbigint kindpayment_method_kind mepay_charge_idvarchar(64) paid_attimestamptz raw_payloadjsonb created_attimestamptz
billing.payout_adjustments — Settlement ledger for post-payout refunds/chargebacks (D-DOM-73).Coluna Tipo id PK uuid reseller_id → billing.payouts.id uuid payout_id → billing.payouts.id uuid source_typevarchar(32) source_iduuid amount_centsbigint snapshotjsonb created_attimestamptz
billing.payout_lines — IMMUTABLE breakdown of the payout formula.Coluna Tipo id PK uuid reseller_id → billing.invoices.id uuid payout_id → billing.payouts.id uuid kindpayout_line_kind invoice_id → billing.invoices.id uuid amount_centsbigint snapshotjsonb created_attimestamptz
billing.payouts — Only billing_mode=vc1_invoices. payout_raw=0 → status settled_zero (no commissioColuna Tipo id PK uuid reseller_id → billing.invoices.id uuid cycle_id → rating.cycles.id uuid statuspayout_status paid_margin_centsbigint shortfall_centsbigint negative_margin_centsbigint net_centsbigint netted_invoice_id → billing.invoices.id uuid commission_invoice_id → billing.commission_invoices.id uuid paid_attimestamptz paid_by_user_id → identity.users.id uuid transfer_refvarchar(64) snapshotjsonb created_attimestamptz updated_attimestamptz
billing.statements — Rated statement for reseller_invoices mode. VC1 does not issue NF to that customColuna Tipo id PK uuid reseller_id → customers.subscriptions.id uuid cycle_id → rating.cycles.id uuid customer_id → customers.customers.id uuid subscription_id → customers.subscriptions.id uuid statusstatement_status subtotal_centsbigint charged_centsbigint cost_centsbigint snapshotjsonb issued_attimestamptz created_attimestamptz updated_attimestamptz
Notas fiscais (NFCom) (fiscal) Documentos NFCom e tentativas de integração fiscal.
Notas fiscais (NFCom). FK internas e refs tracejadas.Abrir em tamanho real fiscal.fiscal_attempts — Append-only. Do not store mePay API keys or third-party issuer secrets.Coluna Tipo id PK uuid reseller_id → fiscal.fiscal_documents.id uuid fiscal_document_id → fiscal.fiscal_documents.id uuid endpointvarchar(64) http_statusint request_hashvarchar(64) responsejsonb successboolean created_attimestamptz
fiscal.fiscal_documents — issued ONLY after mePay webhook fiscal.issued (or poll fallback) with 44-digit aColuna Tipo id PK uuid reseller_id → billing.invoices.id uuid invoice_id → billing.invoices.id uuid statusfiscal_document_status modelvarchar(8) issuer_cnpjvarchar(14) mepay_invoice_idvarchar(64) mepay_fiscal_request_idvarchar(64) access_keyvarchar(44) protocolvarchar(64) pdf_file_id → files.objects.id uuid xml_file_id → files.objects.id uuid authorized_attimestamptz created_attimestamptz updated_attimestamptz
Notificações (notifications) Templates, mensagens e opt-out por canal.
Notificações. FK internas e refs tracejadas.Abrir em tamanho real notifications.messagesColuna Tipo id PK uuid reseller_id → customers.customers.id uuid customer_id → customers.customers.id uuid template_id → notifications.templates.id uuid channelnotification_channel recipientvarchar(255) statusvarchar(16) payloadjsonb provider_message_idvarchar(128) errortext sent_attimestamptz created_attimestamptz
notifications.opt_outsColuna Tipo id PK uuid reseller_id → tenancy.resellers.id uuid recipientvarchar(255) channelnotification_channel created_attimestamptz
notifications.templatesColuna Tipo id PK uuid reseller_id → tenancy.resellers.id uuid keyvarchar(64) channelnotification_channel subjectvarchar(255) bodytext is_activeboolean created_attimestamptz updated_attimestamptz deleted_attimestamptz
Integrações e legado (integration) Outbox, webhooks, conectores e reconciliação.
Integrações e legado. FK internas e refs tracejadas.Abrir em tamanho real integration.connector_calls — Never store SOAP passwords or API tokens. LabGuarded* sets lab_guarded=true.Coluna Tipo id PK uuid reseller_id → tenancy.resellers.id uuid portvarchar(32) adaptervarchar(64) methodvarchar(64) request_hashvarchar(64) response_codeint successboolean lab_guardedboolean errortext duration_msint created_attimestamptz
integration.inbox_webhooks — Dedupe: provider event_id when present; else sha256(envelope_id + event + payloaColuna Tipo id PK uuid reseller_id → tenancy.resellers.id uuid sourcevarchar(32) event_namevarchar(128) idempotency_keyvarchar(128) statuswebhook_status headersjsonb payloadjsonb processed_attimestamptz created_attimestamptz
integration.lab_allowlist — LabGuarded* adapters refuse writes outside this list. Demo WL project + demo SIPColuna Tipo id PK uuid kindvarchar(32) legacy_idbigint accountcodevarchar(128) e164varchar(16) notestext created_attimestamptz deleted_attimestamptz
integration.legacy_id_mapColuna Tipo id PK uuid entity_typevarchar(64) legacy_idbigint entity_uuiduuid legacy_tablevarchar(128) created_attimestamptz
integration.outboxColuna Tipo id PK uuid reseller_id → tenancy.resellers.id uuid aggregate_typevarchar(64) aggregate_iduuid event_namevarchar(128) payloadjsonb statusoutbox_status attemptsint available_attimestamptz published_attimestamptz last_errortext created_attimestamptz
integration.reconciliation_runsColuna Tipo id PK uuid reseller_id → rating.cycles.id uuid cycle_id → rating.cycles.id uuid statusreconciliation_status billed_seconds_sumbigint switch_duration_block_sumbigint sell_cents_sumbigint switch_price_cents_sumbigint drift_percentnumeric(8,4) started_attimestamptz finished_attimestamptz reportjsonb created_attimestamptz
Auditoria (audit) Trilha append-only de auditoria administrativa.
Auditoria. FK internas e refs tracejadas.Abrir em tamanho real audit.audit_log — Append-only. Financial/admin trail retention 5y; auth/access 12m (D-SEC-15).Coluna Tipo id PK uuid reseller_id → tenancy.resellers.id uuid actor_user_id → identity.users.id uuid impersonator_user_id → identity.users.id uuid impersonation_session_id → identity.impersonation_sessions.id uuid actor_scopeactor_scope actionvarchar(128) auditable_typevarchar(128) auditable_iduuid beforejsonb afterjsonb ipvarchar(45) user_agentvarchar(512) created_attimestamptz
Arquivos privados (files) Objetos privados em storage (LGPD, marca, fiscal).
Arquivos privados. FK internas e refs tracejadas.Abrir em tamanho real files.objects — Private object storage only. Portability docs MUST set retained_until. Never pubColuna Tipo id PK uuid reseller_id → tenancy.resellers.id uuid purposefile_purpose diskvarchar(32) pathvarchar(512) mime_typevarchar(128) byte_sizebigint sha256varchar(64) original_namevarchar(255) retained_untildate created_by_user_id → identity.users.id uuid created_attimestamptz deleted_attimestamptz
Autenticação e permissões (identity) Login, papéis RBAC e tokens API (Sanctum).
Autenticação e permissões. FK internas e refs tracejadas.Abrir em tamanho real identity.api_tokens — Replaces public.personal_access_tokens. Reseller public API lives on api.vc1.comColuna Tipo id PK uuid reseller_id → tenancy.resellers.id uuid user_id → identity.users.id uuid namevarchar(128) token_prefixvarchar(12) token_hashvarchar(64) abilitiesjsonb [not null, default: `' last_used_attimestamptz expires_attimestamptz created_attimestamptz updated_attimestamptz deleted_attimestamptz
identity.impersonation_sessionsColuna Tipo id PK uuid staff_user_id → identity.users.id uuid impersonated_user_id → identity.users.id uuid reseller_id → tenancy.resellers.id uuid expires_attimestamptz ended_attimestamptz created_attimestamptz
identity.permissionsColuna Tipo id PK uuid slugvarchar(128) namevarchar(255) created_attimestamptz
identity.role_permissionsColuna Tipo role_id → identity.roles.id uuid permission_id → identity.permissions.id uuid
identity.rolesColuna Tipo id PK uuid slugvarchar(64) namevarchar(128) actor_scopeactor_scope created_attimestamptz updated_attimestamptz
identity.user_rolesColuna Tipo id PK uuid user_id → identity.users.id uuid role_id → identity.roles.id uuid reseller_id → tenancy.resellers.id uuid created_attimestamptz
identity.users — Login for VC1 Filament, reseller panel, customer /app. Replaces public.users (biColuna Tipo id PK uuid reseller_id → customers.customers.id uuid customer_id → customers.customers.id uuid emailvarchar(255) password_hashvarchar(255) full_namevarchar(255) actor_scopeactor_scope is_activeboolean email_verified_attimestamptz last_login_attimestamptz last_login_ipvarchar(45) two_factor_secrettext two_factor_confirmed_attimestamptz localevarchar(16) created_attimestamptz updated_attimestamptz deleted_attimestamptz
Revendas (tenant) (tenancy) Tenant revenda: domínios, marca, STFC e contrato VC1.
Revendas (tenant). FK internas e refs tracejadas.Abrir em tamanho real tenancy.reseller_brandingColuna Tipo id PK uuid reseller_id → tenancy.resellers.id uuid trade_namevarchar(255) logo_file_id → files.objects.id uuid primary_colorvarchar(7) secondary_colorvarchar(7) support_emailvarchar(255) support_phonevarchar(32) sender_emailvarchar(255) sender_namevarchar(128) extrajsonb created_attimestamptz updated_attimestamptz
tenancy.reseller_contracts — VC1 ↔ reseller commercial contract. Snapshot immutable after signed_at.Coluna Tipo id PK uuid reseller_id → tenancy.resellers.id uuid price_base_version_id → pricing.price_base_versions.id uuid vc1_tier_id → pricing.vc1_tiers.id uuid commitment_centsbigint fidelity_monthsint billing_modereseller_billing_mode snapshotjsonb signed_attimestamptz effective_fromdate effective_untildate created_attimestamptz updated_attimestamptz deleted_attimestamptz
tenancy.reseller_domainsColuna Tipo id PK uuid reseller_id → tenancy.resellers.id uuid hostvarchar(255) is_primaryboolean verified_attimestamptz created_attimestamptz updated_attimestamptz deleted_attimestamptz
tenancy.reseller_settingsColuna Tipo id PK uuid reseller_id → tenancy.resellers.id uuid default_payment_modepayment_mode default_overage_policyplan_overage_policy alert_limit_percentsmallint block_limit_percentsmallint allow_negative_marginboolean typedjsonb created_attimestamptz updated_attimestamptz
tenancy.resellers — CHECK billing_mode=reseller_invoices ⇒ exists verified STFC license. CHECK slug Coluna Tipo id PK uuid slugvarchar(63) legal_namevarchar(255) trade_namevarchar(255) documentvarchar(14) statusreseller_status billing_modereseller_billing_mode vc1_tier_id → pricing.vc1_tiers.id uuid price_base_version_id → pricing.price_base_versions.id uuid commitment_centsbigint fidelity_monthsint payment_modepayment_mode due_daysmallint pending_billing_modereseller_billing_mode billing_mode_effective_atdate pending_billing_amendment_envelope_iduuid legacy_project_idbigint legacy_domain_sippulsevarchar(255) payment_gateway_refvarchar(64) onboarded_attimestamptz suspended_attimestamptz terminated_attimestamptz created_attimestamptz updated_attimestamptz deleted_attimestamptz
tenancy.stfc_licenses — Required for billing_mode=reseller_invoices. Verified by VC1 staff.Coluna Tipo id PK uuid reseller_id → tenancy.resellers.id uuid license_numbervarchar(64) document_file_id → files.objects.id uuid valid_fromdate valid_untildate verified_attimestamptz verified_by_user_id → identity.users.id uuid notestext created_attimestamptz updated_attimestamptz deleted_attimestamptz
Retenção e privacidade
Tipo Prazo Notas
CDR / detalhe de chamada ~13 meses Operação e disputa recente
Financeiro, fiscal, contratos ~5 anos Obrigações legais
Logs de acesso ~12 meses Segurança e LGPD
Ver segurança e LGPD →