ERP web para gestão imobiliária com foco em operação comercial, pipeline de vendas, contratos, imóveis, clientes e personalização white-label.
O projeto foi desenhado para demonstrar capacidade de engenharia de software full stack em ambiente realista, incluindo API REST, persistência relacional, frontend moderno, validações, testes e preparo para containerização.
- Visão geral técnica
- Arquitetura da aplicação
- Stack tecnológica (com versões)
- Funcionalidades principais
- Screenshots
- Instalação passo a passo
- Exemplos de uso
- Estrutura de pastas
- Decisões técnicas
- Desafios e soluções
- Métricas de performance
- Testes realizados
- Deploy e configuração
- Contribuição
- Licença
Este ERP é composto por dois blocos principais:
- Frontend SPA em React + TypeScript para gestão visual e operacional.
- Backend API REST em ASP.NET Core + Entity Framework Core para regras de negócio, persistência e integração.
- Oferecer CRUD completo de clientes, imóveis, contratos e negociações.
- Garantir consistência de domínio com mapeamento de enums e validações.
- Permitir escalabilidade modular por camadas (Application/Domain/Infrastructure/Presentation).
- Entregar base pronta para deploy local e evolução para nuvem.
flowchart LR
U[Usuário] --> F[Frontend React SPA]
F -->|HTTP JSON| B[ErpApi ASP.NET Core]
B --> A[Application Services]
A --> D[Domain Entities]
A --> I[Infrastructure EF Core]
I --> S[(SQL Server)]
flowchart TD
P[Presentation<br/>Controllers + Middleware] --> AP[Application<br/>Services + DTOs]
AP --> DM[Domain<br/>Entities + Enums]
AP --> INF[Infrastructure<br/>Repositories + Security]
INF --> DB[(SQL Server)]
sequenceDiagram
participant UI as Frontend (Pipeline.tsx)
participant API as PipelineController
participant SV as PipelineService
participant DB as SQL Server
UI->>API: GET /api/pipeline?page=1&pageSize=400
API->>SV: Buscar negociações
SV->>DB: Query paginada
DB-->>SV: Dados
SV-->>API: PagedResult<PipelineDeal>
API-->>UI: JSON
- React
19.2.4 - TypeScript
~5.9.3 - Vite
8.0.0 - React Router DOM
7.13.1 - React Hook Form
7.71.2 - Zod
4.3.6 - Framer Motion
12.38.0 - Recharts
3.8.0 - Tailwind CSS
4.2.2 - Zustand
5.0.12 - Vitest
4.1.0 - ESLint
9.39.4
- .NET
10.0(TargetFrameworknet10.0) - ASP.NET Core
10.0.5 - Entity Framework Core
10.0.5 - EF Core SQL Server
10.0.5 - JWT Bearer
10.0.5 - Swashbuckle.AspNetCore
10.0.1 - Serilog.AspNetCore
9.0.0
- SQL Server
2022-latest(imagem Docker oficial) - Docker Compose para orquestração local
- 👥 Gestão de Clientes: cadastro, listagem, atualização e filtros.
- 🏠 Gestão de Imóveis: tipologia, status, preço, atributos e catálogo.
- 📄 Gestão de Contratos: vínculo entre cliente/imóvel com status e vigência.
- 📊 Pipeline Comercial: etapas de funil com atualização de estágio por drag-and-drop.
- 📈 Dashboard Operacional: indicadores agregados consumidos do backend.
- 🎨 White-Label Settings: nome da empresa, cor principal e logo persistidos via API.
- 🧰 Seed automático: carga inicial de dados após migração para acelerar demonstração.
Capturas de tela para apresentação visual do produto.
- Dashboard (KPIs)
- Pipeline Kanban
- Cadastro de Cliente
- Tela de Configurações White-label
- Node.js 20+
- npm 10+
- .NET SDK 10+
- Docker Desktop (opcional, para SQL Server local)
git clone <url-do-repositorio>
cd ERP-projetodocker run -e "ACCEPT_EULA=Y" \
-e "MSSQL_SA_PASSWORD=YourStrong!Passw0rd" \
-p 1433:1433 \
-d mcr.microsoft.com/mssql/server:2022-latestcd ErpApi
dotnet restore
dotnet run --launch-profile httpAPI local: http://localhost:5288
Swagger (dev): http://localhost:5288/swagger
cd ../Sistema-ERP-Imobili-rio
npm install
npm run devOpcional: defina VITE_API_BASE_URL para customizar endpoint.
Exemplo .env:
VITE_API_BASE_URL=http://localhost:5288/apiconst apiBaseUrl =
(import.meta.env.VITE_API_BASE_URL as string | undefined)?.replace(/\/$/, '') ??
'http://localhost:5288/api';
export async function getDashboardSummary() {
const response = await fetch(`${apiBaseUrl}/dashboard/summary`);
if (!response.ok) throw new Error('Erro ao buscar resumo');
return response.json();
}curl -X POST "http://localhost:5288/api/pipeline" \
-H "Content-Type: application/json" \
-d '{
"title": "Negociação: Apartamento Centro",
"clientId": "GUID-DO-CLIENTE",
"propertyId": "GUID-DO-IMOVEL",
"value": 450000,
"stage": "leads",
"lastInteractionAt": "2026-03-25T10:00:00Z"
}'[HttpGet("summary")]
public async Task<IActionResult> GetSummary(CancellationToken cancellationToken)
{
var summary = await dashboardService.GetSummaryAsync(cancellationToken);
return Ok(summary);
}ERP-projeto/
├── ErpApi/
│ ├── Application/ # DTOs, serviços e regras de aplicação
│ ├── Domain/ # Entidades, enums e validações de domínio
│ ├── Infrastructure/ # EF Core, repositórios, segurança/JWT
│ ├── Presentation/ # Controllers e middlewares
│ ├── Migrations/ # Histórico de migrações do banco
│ └── Program.cs # Bootstrap da aplicação
├── Sistema-ERP-Imobili-rio/
│ ├── src/features/ # Módulos funcionais por domínio de tela
│ ├── src/services/ # Camada de integração HTTP
│ ├── src/store/ # Estado global (Zustand)
│ └── src/test/ # Testes com Vitest + Testing Library
└── docker-compose.yml # Orquestração local
- Clean Architecture no backend para separar domínio, aplicação, infraestrutura e apresentação.
- DTOs explícitos e paginação padronizada (
PagedResult<T>) para escalabilidade de listagens. - Mapeamento de enums textual (
EnumTextMapper) para UX em português e consistência de persistência. - Frontend orientado a serviços (
src/services/api.ts) para desacoplar UI da fonte de dados. - Seed automático pós-migration para ambiente de demonstração reproduzível.
- CORS restrito a localhost/127.0.0.1 para segurança em desenvolvimento.
- Desafio: migrar telas de dados estáticos para API real.
- Solução: camada de API centralizada, refatoração das features e normalização de payloads.
- Desafio: divergência de nomenclatura em tipos/status.
- Solução: padronização no backend com
EnumTextMapper.
- Desafio: bloqueios de preflight ao consumir API local.
- Solução: política de CORS com validação de origem localhost.
- Desafio: ambiente vazio após primeira execução.
- Solução: execução de migration + seed no startup do backend.
Métricas coletadas em ambiente local de desenvolvimento.
- Build frontend (Vite):
~1.13spara2793 módulos transformados. - Build backend (.NET):
~12.1s(restore + build em execução local). - Bundle principal frontend:
~242.67 kB(arquivoindex-*.js, sem gzip). - Dashboard chunk:
~380.30 kB(sem gzip).
- O build está rápido para ciclo de desenvolvimento.
- Há oportunidade de otimização de bundle por lazy-loading adicional em gráficos e módulos pesados.
npm run lint→ sem erros (warnings de hooks existentes).npm run build→ sucesso (TypeScript + Vite).npm run test→ falha parcial após refatoração do Pipeline (2 testes falharam emPipeline.test.tsx).
dotnet build→ sucesso.
- Atualizar
Pipeline.test.tsxpara refletir fluxo assíncrono de carregamento via API. - Adicionar testes de integração da API (controller + banco em ambiente isolado).
- Backend em
http://localhost:5288 - Frontend em
http://localhost:5173(porta padrão Vite, pode variar) - SQL Server em
localhost:1433
ConnectionStrings:SqlServerJwt:IssuerJwt:AudienceJwt:SecretKeyJwt:ExpiresInMinutes
VITE_API_BASE_URL=http://localhost:5288/api
O repositório possui docker-compose.yml para banco e backend; a etapa de frontend containerizado pode ser evoluída para pipeline completo CI/CD.
Contribuições são bem-vindas para evolução técnica do projeto.
- Faça um fork
- Crie uma branch (
feature/minha-feature) - Commit com mensagens claras
- Abra um Pull Request com contexto técnico
Padrões sugeridos:
- Commits semânticos (
feat:,fix:,refactor:,test:) - PRs pequenos e objetivos
- Evidência de validação (lint/build/test)
No estado atual, não há arquivo de licença definido no repositório.
Para uso comercial/distribuição, recomenda-se definir formalmente uma licença (ex.: MIT, Apache-2.0 ou licença proprietária).
