Tema
Dashboard — Endpoints
Base URL: /api/dashboard
Permissões: Admin, Financial, Broker (dados parciais)
GET /api/dashboard
Retorna os KPIs consolidados da empresa.
Resposta 200:
json
{
"properties": {
"total": 48,
"available": 12,
"reserved": 3,
"rented": 28,
"sold": 5
},
"contracts": {
"active": 31,
"expiringSoon": 4,
"terminated": 17,
"cancelled": 2
},
"financial": {
"monthlyRevenue": 87400.00,
"pendingPayments": 5,
"pendingValue": 14000.00,
"defaultedPayments": 2,
"defaultedValue": 5600.00,
"defaultRate": 0.064
},
"brokers": [
{
"id": "b1c2d3e4-...",
"name": "Paulo Corretor",
"totalSales": 12,
"totalLeases": 28,
"conversionRate": 0.74
},
{
"id": "b2c3d4e5-...",
"name": "Fernanda Vendas",
"totalSales": 8,
"totalLeases": 15,
"conversionRate": 0.62
}
],
"proposals": {
"underReview": 5,
"negotiating": 3,
"approved": 2,
"rejected": 8
},
"visits": {
"scheduled": 7,
"confirmed": 4,
"done": 38,
"cancelled": 6
},
"revenueByMonth": [
{ "period": "2026-01", "value": 72000.00 },
{ "period": "2026-02", "value": 75000.00 },
{ "period": "2026-03", "value": 78500.00 },
{ "period": "2026-04", "value": 82000.00 },
{ "period": "2026-05", "value": 87400.00 }
],
"generatedAt": "2026-05-19T10:00:00Z"
}Descrição dos campos
| Campo | Descrição |
|---|---|
properties.total | Total de imóveis cadastrados (excluindo deletados) |
properties.available | Imóveis com status Available |
contracts.expiringSoon | Contratos ativos que vencem nos próximos 30 dias |
financial.monthlyRevenue | Soma dos pagamentos com status Paid no mês atual |
financial.defaultRate | defaultedValue / (monthlyRevenue + defaultedValue) |
brokers | Lista de corretores com métricas de desempenho |
revenueByMonth | Receita realizada nos últimos 5 meses |
generatedAt | Timestamp de geração dos dados |
Uso no Angular (Dashboard Component)
typescript
// dashboard.component.ts
export class DashboardComponent {
private destroyRef = inject(DestroyRef);
stats = signal<DashboardStats | null>(null);
ngOnInit() {
this.dashboardService.getStats()
.pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(data => this.stats.set(data));
}
}html
<!-- KPI cards -->
<div class="grid grid-cols-4 gap-4">
<app-kpi-card
title="Imóveis Ativos"
[value]="stats()?.properties.available"
icon="home"
/>
<app-kpi-card
title="Receita Mensal"
[value]="stats()?.financial.monthlyRevenue | brlCurrency"
icon="dollar-sign"
/>
</div>
<!-- Gráfico de receita com ng2-charts -->
<canvas baseChart
[data]="revenueChartData()"
type="line"
></canvas>