Verificando acesso...

Dashboard

Visão geral do sistema

?

Dashboard

Imóveis

Portfólio completo de imóveis cadastrados

Código Endereço Tipo Características Aluguel Proprietário Status Ações

Pessoas

Locadores, Locatários e Fiadores

Nome / CPF Tipo E-mail Contato Cidade / UF Status Ações

Cláusulas Contratuais

Banco de cláusulas pré-cadastradas e editáveis

Título Categoria Prévia do Conteúdo Finalidade Status Ações

Contratos de Locação

Geração, assinatura e gestão de contratos

Número Locatário / Locador Imóvel Aluguel Venc. Vigência Índice Status Ações

Autorizações de Venda

Contratos de autorização gerados, assinados e arquivados

Total
Aguardando Assinatura
Assinado pelo Cliente
Assinado Completo
Data Proprietário CPF Imóvel Valor Status Ações

Boletos e Cobranças

Geração e controle de boletos mensais

Número Contrato Locatário Competência Vencimento Composição Valor Total Pago em / Status Ações

Controle de Reajustes

Reajuste de aluguéis por índices econômicos

Índices Econômicos — Últimos 12 Meses

Buscando índices BCB...

IGP-M (12m)

IPCA (12m)

INPC (12m)

7,73%

IVAR (12m) est.

Contratos Pendentes de Reajuste

Contrato Locatário Imóvel Valor Atual Índice Próximo Reajuste Novo Valor Est. Ação

Controle de Repasses

Boletos pagos pelos locatários — gerencie os repasses aos locadores

Aguardando Repasse

Repasses Realizados (mês)

Valor a Repassar

Taxa Adm. Retida (mês)

Rescisões Contratuais

Histórico de rescisões e multas aplicadas

ContratoLocatárioImóvelData RescisãoMotivoMulta Aplicada

Relatórios Financeiros

DRE, inadimplência, receita por imóvel e ocupação do portfólio

Receita Bruta (ano)

Receita Aluguel

Encargos (IPTU/Seguro/Cond.)

Total Repassado

Taxa Adm. Retida

Margem Administrativa

Demonstrativo de Resultado (DRE)

MêsRec. BrutaAluguelEncargosRepassesTaxa Adm.Part. %

Ocupação do Portfólio

Alugados
Disponíveis
Em Reforma
Taxa Ocupação

Inadimplência

Boletos vencidos
Valor em atraso
LocatárioImóvelComp.VencimentoAtrasoValor c/ Enc.

Receita por Imóvel

ImóvelLocadorLocatárioBoletos PagosReceita TotalParticipação

Declaração Anual de Rendimentos (IR)

Alertas de Vencimento

Contratos encerrando, reajustes pendentes e boletos em atraso

Contratos Encerrando (90 dias)

Reajustes Pendentes (60 dias)

Boletos Vencidos

Urgentes (≤ 15 dias)

Contratos Encerrando nos Próximos 90 Dias

ContratoLocatárioImóvelVencimentoPrazoAção

Reajustes Pendentes nos Próximos 60 Dias

ContratoLocatárioImóvelNovo ValorPrazo

Boletos Vencidos (Inadimplência)

BoletoLocatárioImóvelVencimentoDias em AtrasoValor c/ Encargos

Seguradoras

Seguradoras pré-cadastradas para uso nos contratos (Seguro Fiança, Título de Capitalização, Seguro Incêndio)

Seguradora CNPJ Contato Tipos de Seguro Status Ações

Contratos de Prestação de Serviços

Contratos entre a Kairos Imóveis e os locadores para administração de imóveis

Contratos Ativos

Imóveis Administrados

Taxa Média de Adm.

Prazo Médio de Repasse

Nº Contrato Locador(es) Imóveis Destinação Taxa Adm. Repasse Início Status Ações

Gerenciar Usuários

Controle de acesso por nível: Administrador, Locador e Locatário

Administrador — Acesso total ao sistema
Locador — Vê contratos e repasses
Locatário — Vê boletos e contrato
NomeE-mailNível de AcessoPessoa VinculadaCriado emÚltimo AcessoStatusAções

Ativar Log de Acessos — execute no Supabase SQL Editor

Execute o arquivo supabase_acessos_log.sql para criar a tabela acessos_log, as RPCs registrar_acesso e admin_get_acessos_log, e atualizar admin_get_all_profiles com o campo last_sign_in_at.
É seguro rodar mais de uma vez (CREATE OR REPLACE / IF NOT EXISTS).

Abrir Supabase SQL Editor

Configuração necessária — execute UMA VEZ no Supabase SQL Editor

Copie o SQL abaixo, acesse Supabase Dashboard → SQL Editor, cole e clique em Run (▶).
Isso cria a função RPC e ajusta as políticas RLS para o sistema funcionar corretamente.

-- =================================================================
-- SYSLOKA — CONFIGURAÇÃO RLS + RPC (execute UMA VEZ)
-- Supabase Dashboard → SQL Editor → Cole aqui → Run ▶
-- =================================================================

-- ── 1. Remover políticas conflitantes ────────────────────────────
DROP POLICY IF EXISTS "Usuários podem ver seu próprio perfil" ON profiles;
DROP POLICY IF EXISTS "Usuários podem editar seu próprio perfil" ON profiles;
DROP POLICY IF EXISTS "Admin pode ver todos os perfis" ON profiles;
DROP POLICY IF EXISTS "Admin pode inserir perfis" ON profiles;
DROP POLICY IF EXISTS "Admin pode atualizar perfis" ON profiles;
DROP POLICY IF EXISTS "profiles_select_own" ON profiles;
DROP POLICY IF EXISTS "profiles_insert_own" ON profiles;
DROP POLICY IF EXISTS "profiles_update_own" ON profiles;
DROP POLICY IF EXISTS "profiles_admin_all" ON profiles;
DROP POLICY IF EXISTS "profiles_admin_insert" ON profiles;
DROP POLICY IF EXISTS "profiles_admin_update" ON profiles;

-- ── 2. Ativar RLS na tabela profiles ─────────────────────────────
ALTER TABLE profiles ENABLE ROW LEVEL SECURITY;

-- ── 3. Cada usuário lê/edita apenas o próprio perfil ─────────────
CREATE POLICY "profiles_select_own" ON profiles
  FOR SELECT USING (auth.uid() = id);

CREATE POLICY "profiles_insert_own" ON profiles
  FOR INSERT WITH CHECK (auth.uid() = id);

CREATE POLICY "profiles_update_own" ON profiles
  FOR UPDATE USING (auth.uid() = id);

-- ── 4. Admin pode VER e ESCREVER todos os perfis ─────────────────
CREATE POLICY "profiles_admin_select" ON profiles
  FOR SELECT USING (
    (SELECT role FROM profiles WHERE id = auth.uid()) = 'admin'
  );

CREATE POLICY "profiles_admin_insert" ON profiles
  FOR INSERT WITH CHECK (
    (SELECT role FROM profiles WHERE id = auth.uid()) = 'admin'
  );

CREATE POLICY "profiles_admin_update" ON profiles
  FOR UPDATE USING (
    (SELECT role FROM profiles WHERE id = auth.uid()) = 'admin'
  );

-- ── 5. Função RPC para admin listar TODOS os profiles ────────────
-- Usa SECURITY DEFINER para rodar com permissão de superusuário,
-- ignorando RLS completamente. Só admin autenticado pode chamar.
-- NOTA: DROP obrigatório pois o tipo de retorno inclui last_sign_in_at
DROP FUNCTION IF EXISTS admin_get_all_profiles();
CREATE FUNCTION admin_get_all_profiles()
RETURNS TABLE (
  id               uuid,
  nome             text,
  role             text,
  pessoa_id        uuid,
  email            text,
  created_at       timestamptz,
  updated_at       timestamptz,
  last_sign_in_at  timestamptz
)
LANGUAGE plpgsql
SECURITY DEFINER
SET search_path = public
AS $$
BEGIN
  -- Verifica se quem chama é admin
  IF (SELECT p.role FROM profiles p WHERE p.id = auth.uid()) != 'admin' THEN
    RAISE EXCEPTION 'Acesso negado: apenas administradores podem listar todos os perfis';
  END IF;

  RETURN QUERY
    SELECT
      p.id,
      p.nome,
      p.role,
      p.pessoa_id,
      u.email,
      p.created_at,
      p.updated_at,
      u.last_sign_in_at
    FROM profiles p
    LEFT JOIN auth.users u ON u.id = p.id
    ORDER BY p.created_at DESC;
END;
$$;

-- Garante que usuários autenticados podem chamar a função
GRANT EXECUTE ON FUNCTION admin_get_all_profiles() TO authenticated;

-- ── 6. Função RPC para admin inserir/atualizar perfil de outro ────
CREATE OR REPLACE FUNCTION admin_upsert_profile(
  p_id        uuid,
  p_nome      text,
  p_role      text,
  p_pessoa_id uuid DEFAULT NULL
)
RETURNS void
LANGUAGE plpgsql
SECURITY DEFINER
SET search_path = public
AS $$
BEGIN
  IF (SELECT pr.role FROM profiles pr WHERE pr.id = auth.uid()) != 'admin' THEN
    RAISE EXCEPTION 'Acesso negado';
  END IF;

  INSERT INTO profiles (id, nome, role, pessoa_id)
  VALUES (p_id, p_nome, p_role, p_pessoa_id)
  ON CONFLICT (id) DO UPDATE
    SET nome      = EXCLUDED.nome,
        role      = EXCLUDED.role,
        pessoa_id = EXCLUDED.pessoa_id,
        updated_at = now();
END;
$$;

GRANT EXECUTE ON FUNCTION admin_upsert_profile(uuid, text, text, uuid) TO authenticated;

-- =================================================================
-- FIM — Volte ao sistema e recarregue a página de usuários
-- =================================================================
Abrir Supabase SQL Editor

Fluxo completo para criar um novo usuário

  1. Execute o SQL acima no Supabase SQL Editor (apenas uma vez)
  2. Vá em Supabase → Authentication → Users → Add user — crie e-mail e senha
  3. Copie o UUID do usuário recém-criado
  4. Clique em "Novo Usuário" nesta tela, cole o UUID, defina nome, papel e pessoa vinculada
  5. Clique em "Criar Perfil" — o usuário aparecerá na lista

Pré-cadastros

Solicitações enviadas por locadores e locatários via formulário público

Form. Locador Form. Locatário
Total
Pendentes
Aprovados
Importados
Recusados
Protocolo Tipo Nome CPF/CNPJ E-mail Celular Imóvel Data Status Ações

Boletos PDF

Faça upload de boletos para disponibilizar no portal do locatário

Enviar Boletos

Arraste PDFs aqui ou clique para selecionar

Selecione múltiplos arquivos de uma vez · O nome do arquivo deve conter o nome do locatário

Como nomear os arquivos:
O nome do arquivo deve conter o nome (ou parte do nome) do locatário. Ex.: boleto_joao_silva_maio2026.pdf — o sistema buscará automaticamente o locatário correspondente.

Boletos Enviados

Arquivo Locatário vinculado Imóvel / Contrato Enviado em Tamanho Ações