-- =====================================================================
-- SaaS Multi-Tenant para Emissão de NF-e/NFC-e/NFS-e/CT-e
-- PostgreSQL 15+ | Reforma Tributária (IBS/CBS/IS) | LGPD-ready
-- Autor: Blueprint gerado para projeto Lovable
-- =====================================================================

-- Extensões
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE EXTENSION IF NOT EXISTS "pgcrypto";
CREATE EXTENSION IF NOT EXISTS "citext";

-- =====================================================================
-- ENUMS
-- =====================================================================
CREATE TYPE plano_tipo       AS ENUM ('basico','pro','enterprise');
CREATE TYPE ambiente_sefaz   AS ENUM ('homologacao','producao');
CREATE TYPE doc_modelo       AS ENUM ('nfe','nfce','nfse','cte');
CREATE TYPE doc_status       AS ENUM ('rascunho','processando','autorizada','rejeitada','cancelada','denegada','inutilizada');
CREATE TYPE evento_tipo      AS ENUM ('cancelamento','carta_correcao','inutilizacao','manifestacao');
CREATE TYPE pessoa_tipo      AS ENUM ('PF','PJ','EX');
CREATE TYPE regime_tributario AS ENUM ('simples','lucro_presumido','lucro_real','mei');
CREATE TYPE user_role        AS ENUM ('owner','admin','fiscal','financeiro','operador','viewer');

-- =====================================================================
-- TENANTS (multi-empresa raiz do SaaS)
-- =====================================================================
CREATE TABLE tenants (
    id              UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    razao_social    VARCHAR(255) NOT NULL,
    nome_fantasia   VARCHAR(255),
    cnpj            CHAR(14) UNIQUE NOT NULL,
    ie              VARCHAR(20),
    im              VARCHAR(20),
    crt             SMALLINT NOT NULL DEFAULT 3, -- 1=Simples,2=Simples excesso,3=Regime normal
    regime          regime_tributario NOT NULL DEFAULT 'lucro_presumido',
    plano           plano_tipo NOT NULL DEFAULT 'basico',
    ambiente        ambiente_sefaz NOT NULL DEFAULT 'homologacao',
    ativo           BOOLEAN NOT NULL DEFAULT TRUE,
    -- Endereço
    cep             CHAR(8),
    logradouro      VARCHAR(255),
    numero          VARCHAR(20),
    complemento     VARCHAR(100),
    bairro          VARCHAR(100),
    municipio_ibge  CHAR(7),
    municipio       VARCHAR(100),
    uf              CHAR(2),
    -- Contato
    email           CITEXT,
    telefone        VARCHAR(20),
    -- Auditoria
    created_at      TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    updated_at      TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    deleted_at      TIMESTAMPTZ
);
CREATE INDEX idx_tenants_cnpj ON tenants(cnpj) WHERE deleted_at IS NULL;

-- =====================================================================
-- USUÁRIOS (login) e vínculo com tenant (RBAC)
-- =====================================================================
CREATE TABLE users (
    id              UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    email           CITEXT UNIQUE NOT NULL,
    senha_hash      VARCHAR(255) NOT NULL, -- bcrypt/argon2
    nome            VARCHAR(255) NOT NULL,
    cpf             CHAR(11),
    telefone        VARCHAR(20),
    mfa_secret      VARCHAR(255), -- TOTP
    mfa_enabled     BOOLEAN NOT NULL DEFAULT FALSE,
    last_login_at   TIMESTAMPTZ,
    created_at      TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    updated_at      TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    deleted_at      TIMESTAMPTZ
);

CREATE TABLE tenant_users (
    tenant_id       UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
    user_id         UUID NOT NULL REFERENCES users(id)   ON DELETE CASCADE,
    role            user_role NOT NULL DEFAULT 'operador',
    permissions     JSONB NOT NULL DEFAULT '{}'::jsonb,
    created_at      TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    PRIMARY KEY (tenant_id, user_id)
);
CREATE INDEX idx_tenant_users_user ON tenant_users(user_id);

-- =====================================================================
-- CERTIFICADO DIGITAL A1 (criptografado at rest)
-- =====================================================================
CREATE TABLE certificados (
    id              UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    tenant_id       UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
    nome            VARCHAR(255) NOT NULL,
    -- PFX criptografado com KMS/AES-256-GCM (NUNCA armazenar senha em claro)
    pfx_ciphertext  BYTEA NOT NULL,
    pfx_iv          BYTEA NOT NULL,
    pfx_tag         BYTEA NOT NULL,
    senha_ciphertext BYTEA NOT NULL,
    senha_iv        BYTEA NOT NULL,
    senha_tag       BYTEA NOT NULL,
    kms_key_id      VARCHAR(255) NOT NULL,
    titular_cnpj    CHAR(14),
    serial_number   VARCHAR(255),
    valido_de       TIMESTAMPTZ,
    valido_ate      TIMESTAMPTZ,
    ativo           BOOLEAN NOT NULL DEFAULT TRUE,
    created_at      TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    deleted_at      TIMESTAMPTZ
);
CREATE INDEX idx_certificados_tenant ON certificados(tenant_id) WHERE ativo = TRUE;

-- =====================================================================
-- CADASTROS BÁSICOS
-- =====================================================================
CREATE TABLE clientes (
    id              UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    tenant_id       UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
    tipo            pessoa_tipo NOT NULL,
    documento       VARCHAR(20) NOT NULL, -- CPF/CNPJ/ID estrangeiro
    razao_social    VARCHAR(255) NOT NULL,
    nome_fantasia   VARCHAR(255),
    ie              VARCHAR(20),
    indicador_ie    SMALLINT DEFAULT 9, -- 1=Contribuinte,2=Isento,9=Não contribuinte
    email           CITEXT,
    telefone        VARCHAR(20),
    cep             CHAR(8),
    logradouro      VARCHAR(255),
    numero          VARCHAR(20),
    complemento     VARCHAR(100),
    bairro          VARCHAR(100),
    municipio_ibge  CHAR(7),
    municipio       VARCHAR(100),
    uf              CHAR(2),
    pais_codigo     VARCHAR(4) DEFAULT '1058',
    pais_nome       VARCHAR(100) DEFAULT 'BRASIL',
    created_at      TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    updated_at      TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    deleted_at      TIMESTAMPTZ,
    UNIQUE (tenant_id, documento)
);
CREATE INDEX idx_clientes_tenant ON clientes(tenant_id) WHERE deleted_at IS NULL;

-- =====================================================================
-- PRODUTOS / SERVIÇOS (com classificação reforma tributária)
-- =====================================================================
CREATE TABLE produtos (
    id              UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    tenant_id       UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
    codigo          VARCHAR(60) NOT NULL,
    codigo_barras   VARCHAR(20),
    descricao       VARCHAR(255) NOT NULL,
    unidade         VARCHAR(6) NOT NULL DEFAULT 'UN',
    preco           NUMERIC(15,4) NOT NULL DEFAULT 0,
    -- Classificação fiscal
    ncm             CHAR(8),                  -- produto
    nbs             VARCHAR(9),               -- serviço (Nomenclatura Brasileira de Serviços)
    cest            CHAR(7),
    cfop_padrao     CHAR(4),
    -- Reforma tributária (vigência 2026+)
    cst_ibs_cbs     VARCHAR(3),               -- novo CST IBS/CBS
    c_class_trib    VARCHAR(6),               -- cClassTrib (código de classificação tributária)
    aliq_ibs        NUMERIC(7,4),             -- ex: 0.0850 (8,5%)
    aliq_cbs        NUMERIC(7,4),             -- ex: 0.0780
    aliq_is         NUMERIC(7,4),             -- imposto seletivo (se aplicável)
    -- Legados (transição até 2033)
    cst_icms        VARCHAR(3),
    aliq_icms       NUMERIC(7,4),
    cst_pis         VARCHAR(2),
    aliq_pis        NUMERIC(7,4),
    cst_cofins      VARCHAR(2),
    aliq_cofins     NUMERIC(7,4),
    cst_ipi         VARCHAR(2),
    aliq_ipi        NUMERIC(7,4),
    -- Origem
    origem          SMALLINT DEFAULT 0,
    is_servico      BOOLEAN NOT NULL DEFAULT FALSE,
    ativo           BOOLEAN NOT NULL DEFAULT TRUE,
    created_at      TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    updated_at      TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    deleted_at      TIMESTAMPTZ,
    UNIQUE (tenant_id, codigo)
);
CREATE INDEX idx_produtos_tenant ON produtos(tenant_id) WHERE deleted_at IS NULL;
CREATE INDEX idx_produtos_ncm    ON produtos(ncm);

-- =====================================================================
-- DOCUMENTOS FISCAIS (NF-e / NFC-e / NFS-e / CT-e)
-- =====================================================================
CREATE TABLE documentos_fiscais (
    id              UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    tenant_id       UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
    modelo          doc_modelo NOT NULL,
    serie           INT NOT NULL DEFAULT 1,
    numero          BIGINT NOT NULL,
    chave           CHAR(44) UNIQUE,
    status          doc_status NOT NULL DEFAULT 'rascunho',
    ambiente        ambiente_sefaz NOT NULL,
    natureza_op     VARCHAR(255),
    cliente_id      UUID REFERENCES clientes(id),
    -- Totais
    valor_produtos  NUMERIC(15,2) NOT NULL DEFAULT 0,
    valor_desconto  NUMERIC(15,2) NOT NULL DEFAULT 0,
    valor_frete     NUMERIC(15,2) NOT NULL DEFAULT 0,
    valor_seguro    NUMERIC(15,2) NOT NULL DEFAULT 0,
    valor_outros    NUMERIC(15,2) NOT NULL DEFAULT 0,
    valor_total     NUMERIC(15,2) NOT NULL DEFAULT 0,
    -- Reforma
    valor_ibs       NUMERIC(15,2) NOT NULL DEFAULT 0,
    valor_cbs       NUMERIC(15,2) NOT NULL DEFAULT 0,
    valor_is        NUMERIC(15,2) NOT NULL DEFAULT 0,
    -- Legados
    valor_icms      NUMERIC(15,2) NOT NULL DEFAULT 0,
    valor_ipi       NUMERIC(15,2) NOT NULL DEFAULT 0,
    valor_pis       NUMERIC(15,2) NOT NULL DEFAULT 0,
    valor_cofins    NUMERIC(15,2) NOT NULL DEFAULT 0,
    -- SEFAZ
    protocolo       VARCHAR(50),
    motivo_status   TEXT,
    xml_envio       TEXT,
    xml_retorno     TEXT,
    xml_assinado    TEXT,
    danfe_url       VARCHAR(500),
    -- Origem
    emitido_por     UUID REFERENCES users(id),
    emitido_via     VARCHAR(20) DEFAULT 'painel', -- painel, api, lote, importacao
    data_emissao    TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    data_autorizacao TIMESTAMPTZ,
    created_at      TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    updated_at      TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    UNIQUE (tenant_id, modelo, serie, numero)
);
CREATE INDEX idx_doc_tenant_status ON documentos_fiscais(tenant_id, status);
CREATE INDEX idx_doc_emissao       ON documentos_fiscais(tenant_id, data_emissao DESC);
CREATE INDEX idx_doc_chave         ON documentos_fiscais(chave);

-- Itens da nota
CREATE TABLE documento_itens (
    id              UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    documento_id    UUID NOT NULL REFERENCES documentos_fiscais(id) ON DELETE CASCADE,
    produto_id      UUID REFERENCES produtos(id),
    sequencia       INT NOT NULL,
    codigo          VARCHAR(60) NOT NULL,
    descricao       VARCHAR(255) NOT NULL,
    ncm             CHAR(8),
    nbs             VARCHAR(9),
    cfop            CHAR(4),
    unidade         VARCHAR(6) NOT NULL DEFAULT 'UN',
    quantidade      NUMERIC(15,4) NOT NULL,
    preco_unitario  NUMERIC(15,4) NOT NULL,
    valor_total     NUMERIC(15,2) NOT NULL,
    valor_desconto  NUMERIC(15,2) NOT NULL DEFAULT 0,
    -- Reforma (por item — obrigatório destacar a partir 2026)
    cst_ibs_cbs     VARCHAR(3),
    c_class_trib    VARCHAR(6),
    base_ibs_cbs    NUMERIC(15,2) NOT NULL DEFAULT 0,
    aliq_ibs        NUMERIC(7,4),
    valor_ibs       NUMERIC(15,2) NOT NULL DEFAULT 0,
    aliq_cbs        NUMERIC(7,4),
    valor_cbs       NUMERIC(15,2) NOT NULL DEFAULT 0,
    aliq_is         NUMERIC(7,4),
    valor_is        NUMERIC(15,2) NOT NULL DEFAULT 0,
    -- Legados
    cst_icms        VARCHAR(3),
    base_icms       NUMERIC(15,2) NOT NULL DEFAULT 0,
    aliq_icms       NUMERIC(7,4),
    valor_icms      NUMERIC(15,2) NOT NULL DEFAULT 0,
    valor_ipi       NUMERIC(15,2) NOT NULL DEFAULT 0,
    valor_pis       NUMERIC(15,2) NOT NULL DEFAULT 0,
    valor_cofins    NUMERIC(15,2) NOT NULL DEFAULT 0,
    UNIQUE (documento_id, sequencia)
);
CREATE INDEX idx_itens_doc ON documento_itens(documento_id);

-- Eventos (cancelamento, CC-e, inutilização)
CREATE TABLE documento_eventos (
    id              UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    documento_id    UUID REFERENCES documentos_fiscais(id) ON DELETE CASCADE,
    tenant_id       UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
    tipo            evento_tipo NOT NULL,
    sequencia       INT NOT NULL DEFAULT 1,
    justificativa   TEXT,
    protocolo       VARCHAR(50),
    xml_envio       TEXT,
    xml_retorno     TEXT,
    status          VARCHAR(50),
    motivo_status   TEXT,
    criado_por      UUID REFERENCES users(id),
    created_at      TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_eventos_doc ON documento_eventos(documento_id);

-- Numeração sequencial por tenant/modelo/série (evita gap e duplicidade)
CREATE TABLE numeracao_documentos (
    tenant_id       UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
    modelo          doc_modelo NOT NULL,
    serie           INT NOT NULL,
    proximo_numero  BIGINT NOT NULL DEFAULT 1,
    PRIMARY KEY (tenant_id, modelo, serie)
);

-- =====================================================================
-- FINANCEIRO (básico)
-- =====================================================================
CREATE TABLE contas_receber (
    id              UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    tenant_id       UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
    documento_id    UUID REFERENCES documentos_fiscais(id),
    cliente_id      UUID REFERENCES clientes(id),
    descricao       VARCHAR(255),
    valor           NUMERIC(15,2) NOT NULL,
    valor_pago      NUMERIC(15,2) NOT NULL DEFAULT 0,
    vencimento      DATE NOT NULL,
    pago_em         TIMESTAMPTZ,
    status          VARCHAR(20) NOT NULL DEFAULT 'aberto',
    created_at      TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_cr_tenant ON contas_receber(tenant_id, status, vencimento);

CREATE TABLE contas_pagar (
    id              UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    tenant_id       UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
    fornecedor      VARCHAR(255),
    descricao       VARCHAR(255),
    valor           NUMERIC(15,2) NOT NULL,
    valor_pago      NUMERIC(15,2) NOT NULL DEFAULT 0,
    vencimento      DATE NOT NULL,
    pago_em         TIMESTAMPTZ,
    status          VARCHAR(20) NOT NULL DEFAULT 'aberto',
    created_at      TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_cp_tenant ON contas_pagar(tenant_id, status, vencimento);

-- =====================================================================
-- API PÚBLICA (chaves + webhooks)
-- =====================================================================
CREATE TABLE api_keys (
    id              UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    tenant_id       UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
    nome            VARCHAR(100) NOT NULL,
    key_prefix      VARCHAR(12) NOT NULL,         -- ex: sk_live_abcd
    key_hash        VARCHAR(255) NOT NULL,        -- hash sha256 do segredo
    scopes          TEXT[] NOT NULL DEFAULT '{}',
    last_used_at    TIMESTAMPTZ,
    revoked_at      TIMESTAMPTZ,
    created_at      TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    UNIQUE (key_prefix)
);

CREATE TABLE webhooks (
    id              UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    tenant_id       UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
    url             VARCHAR(500) NOT NULL,
    eventos         TEXT[] NOT NULL,              -- ex: {nfe.autorizada, nfe.cancelada}
    secret          VARCHAR(255) NOT NULL,
    ativo           BOOLEAN NOT NULL DEFAULT TRUE,
    created_at      TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

CREATE TABLE webhook_entregas (
    id              UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    webhook_id      UUID NOT NULL REFERENCES webhooks(id) ON DELETE CASCADE,
    evento          VARCHAR(50) NOT NULL,
    payload         JSONB NOT NULL,
    http_status     INT,
    tentativas      INT NOT NULL DEFAULT 0,
    proxima_tentativa TIMESTAMPTZ,
    entregue        BOOLEAN NOT NULL DEFAULT FALSE,
    created_at      TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_wh_pendentes ON webhook_entregas(entregue, proxima_tentativa);

-- =====================================================================
-- BILLING SAAS (Stripe / Mercado Pago)
-- =====================================================================
CREATE TABLE assinaturas (
    id              UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    tenant_id       UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
    plano           plano_tipo NOT NULL,
    provedor        VARCHAR(20) NOT NULL,         -- stripe, mp
    provedor_sub_id VARCHAR(255),
    status          VARCHAR(30) NOT NULL,         -- trialing, active, past_due, canceled
    inicio          TIMESTAMPTZ NOT NULL,
    fim             TIMESTAMPTZ,
    notas_emitidas_mes INT NOT NULL DEFAULT 0,
    limite_notas_mes INT,
    created_at      TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_assinaturas_tenant ON assinaturas(tenant_id, status);

-- =====================================================================
-- AUDITORIA / LGPD
-- =====================================================================
CREATE TABLE audit_logs (
    id              UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    tenant_id       UUID REFERENCES tenants(id) ON DELETE SET NULL,
    user_id         UUID REFERENCES users(id) ON DELETE SET NULL,
    acao            VARCHAR(80) NOT NULL,
    entidade        VARCHAR(80),
    entidade_id     UUID,
    ip              INET,
    user_agent      TEXT,
    payload         JSONB,
    created_at      TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_audit_tenant_data ON audit_logs(tenant_id, created_at DESC);

-- =====================================================================
-- TRIGGER updated_at
-- =====================================================================
CREATE OR REPLACE FUNCTION set_updated_at() RETURNS TRIGGER AS $$
BEGIN NEW.updated_at = NOW(); RETURN NEW; END;
$$ LANGUAGE plpgsql;

DO $$
DECLARE t text;
BEGIN
  FOR t IN SELECT unnest(ARRAY['tenants','users','clientes','produtos','documentos_fiscais']) LOOP
    EXECUTE format('CREATE TRIGGER trg_%I_upd BEFORE UPDATE ON %I FOR EACH ROW EXECUTE FUNCTION set_updated_at();', t, t);
  END LOOP;
END $$;

-- =====================================================================
-- ROW LEVEL SECURITY (isolamento por tenant)
-- =====================================================================
-- A aplicação deve executar: SET LOCAL app.tenant_id = '<uuid>'; antes de cada query
ALTER TABLE clientes              ENABLE ROW LEVEL SECURITY;
ALTER TABLE produtos              ENABLE ROW LEVEL SECURITY;
ALTER TABLE documentos_fiscais    ENABLE ROW LEVEL SECURITY;
ALTER TABLE documento_itens       ENABLE ROW LEVEL SECURITY;
ALTER TABLE documento_eventos     ENABLE ROW LEVEL SECURITY;
ALTER TABLE certificados          ENABLE ROW LEVEL SECURITY;
ALTER TABLE contas_receber        ENABLE ROW LEVEL SECURITY;
ALTER TABLE contas_pagar          ENABLE ROW LEVEL SECURITY;
ALTER TABLE api_keys              ENABLE ROW LEVEL SECURITY;
ALTER TABLE webhooks              ENABLE ROW LEVEL SECURITY;

CREATE POLICY tenant_isolation_clientes ON clientes
  USING (tenant_id::text = current_setting('app.tenant_id', true));
CREATE POLICY tenant_isolation_produtos ON produtos
  USING (tenant_id::text = current_setting('app.tenant_id', true));
CREATE POLICY tenant_isolation_docs ON documentos_fiscais
  USING (tenant_id::text = current_setting('app.tenant_id', true));
CREATE POLICY tenant_isolation_itens ON documento_itens
  USING (EXISTS (SELECT 1 FROM documentos_fiscais d
                 WHERE d.id = documento_itens.documento_id
                   AND d.tenant_id::text = current_setting('app.tenant_id', true)));
CREATE POLICY tenant_isolation_eventos ON documento_eventos
  USING (tenant_id::text = current_setting('app.tenant_id', true));
CREATE POLICY tenant_isolation_cert ON certificados
  USING (tenant_id::text = current_setting('app.tenant_id', true));
CREATE POLICY tenant_isolation_cr ON contas_receber
  USING (tenant_id::text = current_setting('app.tenant_id', true));
CREATE POLICY tenant_isolation_cp ON contas_pagar
  USING (tenant_id::text = current_setting('app.tenant_id', true));
CREATE POLICY tenant_isolation_keys ON api_keys
  USING (tenant_id::text = current_setting('app.tenant_id', true));
CREATE POLICY tenant_isolation_wh ON webhooks
  USING (tenant_id::text = current_setting('app.tenant_id', true));

-- FIM DO SCHEMA
