NX
console

NexoTerraCore
Console

Gestão de imóveis, fazendas e armazéns.

Login

Acesso restrito à equipe operacional.

Usuário ou senha inválidos.
·
Nova senha
{{ senhaMsg }}
Recuperar acesso
A senha fica gravada apenas neste navegador. Se você a esqueceu, restaure o acesso padrão e cadastre uma nova em seguida.
nexoterracore/{{ crumb }}
db: PostgreSQL · online
{{ totalPatrimonio }}
patrimônio declarado · {{ totalRegistros }} bens
{{ receitaMensal }} / mês
{{ nImoveis }}
imóveis
{{ totalHectares }}
hectares
{{ totalCapacidade }}
t de armazenagem
{{ nAlugueis }}
contratos
Últimos registros
Nenhum bem registrado.
{{ r.kind }} {{ r.nome }} {{ r.local }}

Imóveis

Urbanos, comerciais e lotes, com matrícula e imobiliária responsável.

Título
Tipo
Cidade / UF
Matrícula
Valor
Status
Nenhum imóvel cadastrado.
{{ i.titulo }}
{{ i.tipo }}
{{ i.local }}
{{ i.matricula }}
{{ i.valorFmt }}
{{ i.status }}

Fazendas

Área, matrícula, CAR, cultura e coordenada do sede.

Propriedade
Município / UF
Hectares
Cultura
Coordenada
Status
Nenhuma fazenda cadastrada.
{{ f.nome }}
{{ f.local }}
{{ f.hectares }}
{{ f.cultura }}
{{ f.coord }}
{{ f.status }}

Armazéns e silos

Capacidade estática, tipo de estrutura e ocupação.

Unidade
Estrutura
Cidade / UF
Capacidade
Ocupação
Status
Nenhuma unidade cadastrada.
{{ a.nome }}
{{ a.tipo }}
{{ a.local }}
{{ a.capacidade }} t
{{ a.ocupacao }}
{{ a.status }}

Proprietários

Titulares dos bens sob minha gestão, com taxa de administração e contato.

Nome / razão social
CPF / CNPJ
Taxa adm.
Cidade / UF
Contato
Nenhum proprietário cadastrado.
{{ m.nome }}
{{ m.cnpj }}
{{ m.creci }}
{{ m.local }}
{{ m.responsavel }}

Aluguéis

Contratos, inquilinos, vencimento e reajuste.

Ativo
Inquilino
Aluguel
Venc.
Vigência
Status
Nenhum contrato cadastrado.
{{ l.ativo }}
{{ l.inquilino }}
{{ l.valorFmt }}
dia {{ l.vencimento }}
{{ l.vigencia }}
{{ l.status }}

Matrículas

Registro de cartório por ativo, com ônus e averbações.

Matrícula
Ativo
Cartório
Comarca
Ônus
Nenhuma matrícula registrada. Ela é criada junto com o imóvel ou a fazenda.
{{ t.matricula }}
{{ t.ativo }}
{{ t.cartorio }}
{{ t.comarca }}
{{ t.onus }}

Financeiro

Receitas, despesas e comissões por ativo.

Receitas
{{ totalReceita }}
Despesas
{{ totalDespesa }}
Resultado
{{ totalResultado }}
Descrição
Tipo
Categoria
Valor
Data
Nenhum lançamento registrado.
{{ c.descricao }}
{{ c.tipo }}
{{ c.categoria }}
{{ c.valorFmt }}
{{ c.data }}

Patrimônio

Composição do portfólio por classe de ativo.

{{ totalPatrimonio }}
valor declarado, {{ totalRegistros }} ativos
Imóveis urbanos{{ nImoveis }} ativos{{ valorImoveis }}
Terra rural{{ totalHectares }} ha{{ valorFazendas }}
Armazenagem{{ totalCapacidade }} t{{ valorArmazens }}

Geo-referência

Coordenadas e polígonos dos ativos, prontos para a camada Google Earth.

Camada de mapa desconectada
O visualizador carrega tiles do Google Earth/Maps com a chave em GOOGLE_MAPS_API_KEY e desenha os polígonos vindos do PostGIS.
Ativo
Coordenada
SRID
Geometria
Nenhuma coordenada cadastrada.
{{ g.nome }}
{{ g.coord }}
EPSG:4674
{{ g.tipo }}

PicPay

Ciclo de gestão: cobrar o inquilino, repassar ao proprietário, retirar a administração.

A receber no mês
{{ receitaMensal }}
Repasse aos proprietários
{{ repasse }}
Taxa de administração (10%)
{{ taxaAdm }}
1 · Cobrança
Pix ou boleto por contrato
Todo contrato ativo gera a cobrança no dia do vencimento, com o link no próprio registro.
2 · Repasse
Split para o titular
Pagamento confirmado, o valor líquido vai ao proprietário e a administração fica retida.
3 · Inadimplência
Régua de cobrança
Sem baixa no vencimento, o contrato entra em atraso e a régua de avisos é disparada.
Integração
Credenciais em PICPAY_TOKEN e PICPAY_SELLER_TOKEN. O webhook de confirmação grava a receita em ledger e dá baixa no contrato. Nenhuma conta conectada.

Arquitetura

Três camadas, um repositório, tudo local com um comando.

apps/web
Front-end
Next.js 14 (App Router), TypeScript, Tailwind. Sidebar recolhível com estado em cookie. Server Components nas listagens, client nos formulários.
apps/api
Back-end
Node 20 com Fastify, Zod na validação, JWT em cookie httpOnly, senha em argon2. REST por recurso, camada de serviço isolada do ORM.
packages/db
Dados
PostgreSQL 16 com PostGIS para polígonos. Prisma dono das migrações. Row Level Security por imobiliária.
Estrutura de pastas
nexoterra/
├─ apps/
│  ├─ web/        console, login, sidebar recolhível
│  └─ api/        auth, imóveis, fazendas, armazéns, financeiro
├─ packages/
│  ├─ db/         Prisma schema + migrações
│  └─ ui/         componentes compartilhados
├─ docker-compose.yml   Postgres 16 + PostGIS
└─ .env.example
Fluxo de autenticação
O formulário envia usuário e senha para POST /auth/login. A API confere o hash argon2, emite JWT de 15 minutos e refresh de 7 dias, ambos em cookie httpOnly. O middleware do Next protege tudo sob /console e devolve ao login quando o token expira.

Banco de dados

Esquema criado vazio pelas migrações.

schema.sql
create extension if not exists pgcrypto;
create extension if not exists postgis;

create table users (
  id uuid primary key default gen_random_uuid(),
  username text unique not null,
  password text not null,              -- hash argon2
  role text not null default 'admin',
  created_at timestamptz default now()
);

create table agencies (                -- imobiliárias
  id uuid primary key default gen_random_uuid(),
  name text not null, cnpj text unique, creci text,
  city text, state char(2), manager text
);

create table properties (              -- imóveis
  id uuid primary key default gen_random_uuid(),
  agency_id uuid references agencies(id),
  title text not null, kind text,
  address text, city text, state char(2),
  area_m2 numeric(12,2), bedrooms int,
  registration text,                   -- matrícula
  price_cents bigint, status text default 'draft',
  lat numeric(9,6), lng numeric(9,6)
);

create table farms (                   -- fazendas
  id uuid primary key default gen_random_uuid(),
  name text not null, municipality text, state char(2),
  hectares numeric(12,2), registration text, car_code text,
  crop text, price_cents bigint, status text default 'draft',
  geom geometry(Polygon, 4674)
);

create table warehouses (              -- armazéns e silos
  id uuid primary key default gen_random_uuid(),
  name text not null, kind text,       -- silo | granel | convencional
  city text, state char(2), country text default 'BR',
  capacity_t numeric(12,2), occupancy_pct numeric(5,2),
  price_cents bigint, status text default 'draft'
);

create table leases (                  -- aluguéis
  id uuid primary key default gen_random_uuid(),
  asset_type text not null, asset_id uuid not null,
  tenant text not null, rent_cents bigint,
  due_day int, start_date date, end_date date,
  status text default 'active'
);

create table ledger (                  -- financeiro
  id uuid primary key default gen_random_uuid(),
  description text not null,
  kind text not null,                  -- receita | despesa
  category text, amount_cents bigint, entry_date date,
  asset_type text, asset_id uuid
);

create table market_quotes (
  id bigserial primary key,
  region text, commodity text,
  price numeric(14,4), currency char(3),
  observed_at timestamptz default now()
);

Rodar no VSCode

Do clone ao login funcionando. Requer Node 20, pnpm e Docker.

1
Abrir a pasta e instalar
No VSCode: File → Open Folder. Terminal integrado com Ctrl+`.
git clone <repo> nexoterra
cd nexoterra
pnpm install
2
Subir o PostgreSQL
Postgres 16 com PostGIS na porta 5432.
docker compose up -d db
cp .env.example .env
3
Criar tabelas e o usuário admin
As migrações criam o esquema vazio e um único usuário.
pnpm --filter db prisma migrate dev
pnpm --filter db bootstrap:admin   # admin / 123
4
Rodar front e back
API em :3001, console em :3000.
pnpm dev
5
Entrar e trocar a senha
Abra https://nexoterracore-api.onrender.com, entre com admin / 123 e troque a senha antes de expor o ambiente.
.env
DATABASE_URL="postgresql://nexo:nexo@localhost:5432/nexoterra"
JWT_SECRET="troque-este-valor"
API_URL="http://localhost:3001"
GOOGLE_MAPS_API_KEY=""
Extensões recomendadas
Prisma · ESLint · Tailwind CSS IntelliSense · PostgreSQL (ms-ossdata) · Docker · Error Lens
{{ formTitle }}
Identificação
Localização
Mapa
Abre em uma nova aba com o endereço preenchido. Cole o link de volta no campo acima para guardar no cadastro.
Lote e terreno
Construção
Registro e valor
Propriedade
Regularização
Unidade
Titular
Contrato
Lançamento
{{ formEndpoint }}