🔒

Acesso Restrito

Seu usuário não foi reconhecido como Administrador nem pelo JWT nem pelo banco de dados.

Carregando diagnóstico...
⚡ Solução em 1 minuto:
  1. Acesse o SQL Editor do Supabase
  2. Cole e execute o script scripts/014_sync_jwt_perfil.sql
  3. Faça logout e login novamente neste portal
  4. Acesse esta tela novamente ✅
-- Promoção rápida (substitua pelo seu e-mail):
UPDATE public.usuarios SET perfil = 'admin'
WHERE email = 'michellcarrilhossa@gmail.com';

-- Depois sincronize o JWT:
UPDATE auth.users SET raw_user_meta_data = raw_user_meta_data || '{"perfil":"admin"}'
WHERE email = 'michellcarrilhossa@gmail.com';
Abrir SQL Editor

Visão Geral do Sistema

Acompanhe estatísticas, usuários e a saúde da plataforma.

Total de Usuários

-

Inquilinos, proprietários e corretores

👥
Imóveis Cadastrados

-

Anúncios ativos no catálogo

🏢
Propostas Enviadas

-

Propostas de aluguel e compra

📄
Distribuição por Tipo de Imóvel Catálogo DOISQ
Max Med 0
Distribuição de Perfis
Inquilinos -
Proprietários -
Corretores -
Administradores -
Nome E-mail / Telefone Perfil CPF Status Ações
Mostrando 0-0 de 0 usuários
Imóvel Tipo Transação Preço Proprietário Corretor Status Ações
Mostrando 0-0 de 0 imóveis
Nome do Corretor E-mail / Telefone CRECI Agência Imóveis Associados Ações
Mostrando 0 de 0 corretores
💡 Diagnóstico de Segurança (Row Level Security - RLS)

O Supabase utiliza políticas de segurança a nível de linha para garantir que usuários não editem nem visualizem dados alheios. Para que esta tela administrativa de Gestão de Usuários e Imóveis funcione com 100% de autonomia e segurança, as políticas RLS administrativas precisam estar cadastradas no seu banco de dados.

⚠️ Como rodar a Migration de Segurança em menos de 1 minuto:
  1. Acesse a sua conta e o projeto no painel do Supabase Dashboard.
  2. Acesse o menu lateral esquerdo na seção SQL Editor.
  3. Crie uma nova consulta clicando em New Query.
  4. Copie o código SQL abaixo clicando no botão de cópia e cole no editor do Supabase.
  5. Clique em Run (no canto inferior direito do painel). Pronto!
Script SQL: `scripts/010_admin_rls.sql`
-- ============================================================
-- DOISQ — Migration 010: Políticas RLS para Administradores
-- ============================================================

DROP POLICY IF EXISTS "usuarios: admin select" ON usuarios;
CREATE POLICY "usuarios: admin select" ON usuarios
  FOR SELECT USING (
    (auth.jwt() -> 'user_metadata' ->> 'perfil') = 'admin'
  );

DROP POLICY IF EXISTS "usuarios: admin all" ON usuarios;
CREATE POLICY "usuarios: admin all" ON usuarios
  FOR ALL USING (
    (auth.jwt() -> 'user_metadata' ->> 'perfil') = 'admin'
  );

DROP POLICY IF EXISTS "perfis: admin all" ON perfis;
CREATE POLICY "perfis: admin all" ON perfis
  FOR ALL USING (
    EXISTS (SELECT 1 FROM usuarios WHERE id = auth.uid() AND perfil = 'admin')
  );

DROP POLICY IF EXISTS "corretores: admin all" ON corretores;
CREATE POLICY "corretores: admin all" ON corretores
  FOR ALL USING (
    EXISTS (SELECT 1 FROM usuarios WHERE id = auth.uid() AND perfil = 'admin')
  );

DROP POLICY IF EXISTS "imoveis: admin select" ON imoveis;
CREATE POLICY "imoveis: admin select" ON imoveis
  FOR SELECT USING (
    EXISTS (SELECT 1 FROM usuarios WHERE id = auth.uid() AND perfil = 'admin')
  );

DROP POLICY IF EXISTS "imoveis: admin all" ON imoveis;
CREATE POLICY "imoveis: admin all" ON imoveis
  FOR ALL USING (
    EXISTS (SELECT 1 FROM usuarios WHERE id = auth.uid() AND perfil = 'admin')
  ) WITH CHECK (
    EXISTS (SELECT 1 FROM usuarios WHERE id = auth.uid() AND perfil = 'admin')
  );

DROP POLICY IF EXISTS "imagens_imovel: admin all" ON imagens_imovel;
CREATE POLICY "imagens_imovel: admin all" ON imagens_imovel
  FOR ALL USING (
    EXISTS (SELECT 1 FROM usuarios WHERE id = auth.uid() AND perfil = 'admin')
  );
      
Script SQL: `scripts/020_admin_alterar_senha.sql` (Para Troca de Senha)
-- ============================================================
-- DOISQ — Migration 020: Função para Alteração de Senha por Admin
-- ============================================================

CREATE OR REPLACE FUNCTION public.admin_alterar_senha(
  usuario_id UUID,
  nova_senha TEXT
)
RETURNS VOID
LANGUAGE plpgsql
SECURITY DEFINER
AS $$
BEGIN
  -- 1. Verifica se quem está executando a função é um administrador
  IF NOT EXISTS (
    SELECT 1 FROM public.usuarios 
    WHERE id = auth.uid() AND perfil = 'admin'
  ) THEN
    RAISE EXCEPTION 'Acesso negado: apenas administradores podem alterar senhas.';
  END IF;

  -- 2. Valida o tamanho mínimo da senha
  IF nova_senha IS NULL OR length(nova_senha) < 6 THEN
    RAISE EXCEPTION 'A senha deve conter no mínimo 6 caracteres.';
  END IF;

  -- 3. Atualiza na tabela auth.users do Supabase usando a extensão pgcrypto
  UPDATE auth.users
  SET 
    encrypted_password = crypt(nova_senha, gen_salt('bf')),
    updated_at = now()
  WHERE id = usuario_id;
END;
$$;

-- 4. Garante que usuários autenticados possam invocar a função via RPC
GRANT EXECUTE ON FUNCTION public.admin_alterar_senha(UUID, TEXT) TO authenticated;
      
Ícone Nome Categoria Tipos de Imóvel Ações
Mostrando 0 de 0 comodidades
Ícone Nome / Slug Ordem Status Ações
Mostrando 0 tipos
⚙️ Configurações Gerais do Sistema

Ajuste as configurações globais da plataforma, como limites de imóveis e outros parâmetros de negócio.

Quantidade máxima de anúncios ativos permitida para corretores no plano gratuito.

Quantidade máxima de anúncios ativos permitida para imobiliárias no plano gratuito.

Tarifa padrão cobrada por cada consulta individual de score de crédito.

Tarifa padrão cobrada por cada assinatura digital de contrato realizada.

O token de autenticação da API ZapSign está armazenado com criptografia segura no Supabase Vault sob a chave DOISQ_ZAPSIGN e não fica exposto em tabelas do banco.

💡 Script SQL de Configuração (`scripts/026_configuracoes_sistema.sql`)

Caso a tabela de configurações ainda não tenha sido criada no seu banco de dados Supabase, copie o código abaixo e execute-o no SQL Editor do seu projeto.

Script SQL: `scripts/026_configuracoes_sistema.sql`
-- ============================================================
-- DOISQ — Migration 026: Configurações do Sistema e Limites Gratuitos
-- ============================================================

CREATE TABLE IF NOT EXISTS configuracoes (
  chave         TEXT PRIMARY KEY,
  valor         TEXT NOT NULL,
  descricao     TEXT,
  atualizado_em TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

INSERT INTO configuracoes (chave, valor, descricao)
VALUES 
  ('limite_gratuito_corretor', '2', 'Limite máximo de anúncios ativos permitidos para corretores no plano gratuito'),
  ('limite_gratuito_imobiliaria', '2', 'Limite máximo de anúncios ativos permitidos para imobiliárias no plano gratuito'),
  ('valor_consulta_score', '9.90', 'Preço cobrado por consulta individual de score de crédito'),
  ('valor_assinatura_contrato', '19.90', 'Preço cobrado por assinatura digital de contrato')
ON CONFLICT (chave) DO UPDATE SET
  valor = EXCLUDED.valor,
  descricao = EXCLUDED.descricao;

ALTER TABLE configuracoes ENABLE ROW LEVEL SECURITY;

DROP POLICY IF EXISTS "configuracoes: leitura publica" ON configuracoes;
CREATE POLICY "configuracoes: leitura publica" ON configuracoes FOR SELECT USING (true);

DROP POLICY IF EXISTS "configuracoes: admin all" ON configuracoes;
CREATE POLICY "configuracoes: admin all" ON configuracoes FOR ALL
USING (EXISTS (SELECT 1 FROM usuarios WHERE id = auth.uid() AND perfil = 'admin'))
WITH CHECK (EXISTS (SELECT 1 FROM usuarios WHERE id = auth.uid() AND perfil = 'admin'));

GRANT ALL ON configuracoes TO postgres, service_role;
GRANT SELECT ON configuracoes TO anon, authenticated;
      
Nome / Slug Público-Alvo Preço Mensal Limite de Imóveis Limite de Usuários Ações
🧠
Total de Usos
0
👥
Usuários Únicos
0
🤖
OpenAI (GPT-4)
0
Rápida Local
0
Usuário Perfil de Usuário OpenAI GPT-4 Rápida Local Total de Utilizações Última Utilização
Mostrando 0 registros