@horizon-labs/property-model-v3
Version:
Modelo de propriedades imobiliárias v3 - Sistema de atributos dinâmicos
278 lines (219 loc) • 7.01 kB
Markdown
Sistema de modelos de propriedades imobiliárias v3 com atributos dinâmicos e mapeamento customizado.
```bash
npm install @horizon-labs/property-model-v3
pnpm add @horizon-labs/property-model-v3
yarn add @horizon-labs/property-model-v3
```
```typescript
import {
PropertyType,
PropertyAttributesModel,
propertyV3CustomMapper
} from '@horizon-labs/property-model-v3';
// Exemplo de propriedade
const property: PropertyType = {
reference: "AP001",
title: "Apartamento 2 quartos",
description: "Lindo apartamento...",
attributes: [
{ key: "dormitorios", value: 2 },
{ key: "banheiros", value: 1 },
{ key: "area_privativa", value: 65, unit: "m²" }
],
media: { pictures: [], videos: [], tour360: [] },
tags: "",
updated_at: new Date().toISOString()
};
```
Interface principal que define a estrutura de uma propriedade:
- `reference`: Código único da propriedade
- `title`: Título da propriedade
- `description`: Descrição detalhada
- `attributes`: Array de atributos dinâmicos
- `media`: Fotos, vídeos e tour 360°
- `tags`: Tags separadas por espaço
- `updated_at`: Data da última atualização
Estrutura de atributos dinâmicos:
- `key`: Chave do atributo (ex: "dormitorios")
- `value`: Valor do atributo
- `valueLabel`: Label formatado para exibição
- `type`: Tipo do dado ("Number", "String", "Boolean", "String[]")
- `unit`: Unidade de medida ("BRL", "m²", "m")
- `composedLabel`: Label composto com templates
### Sistema de Atributos
O módulo inclui **96 atributos pré-definidos** organizados em categorias:
#### Categorias Disponíveis
- **Comercial**: `operacao`, `status_comercial`, `financiavel`
- **Valores**: `valor_venda`, `valor_locacao`, `valor_condominio`
- **Localização**: `endereco_cidade`, `endereco_bairro`, `latitude`
- **Estrutura**: `tipo`, `area_privativa`, `dormitorios`
- **Dependências**: `dormitorios`, `banheiros`, `suites`, `vagas_garagem`
```typescript
import { PropertyAttributesModel } from '@horizon-labs/property-model-v3';
// Encontrar atributo específico
const dormitoriosAttr = PropertyAttributesModel.find(attr => attr.key === "dormitorios");
console.log(dormitoriosAttr);
// { key: "dormitorios", label: "Dormitórios", type: "Number", cat: "dependencias" }
```
Sistema avançado de transformação e normalização de propriedades com regras condicionais.
```typescript
import { propertyV3CustomMapper } from '@horizon-labs/property-model-v3';
const mapRules = {
// Regras baseadas no tipo do imóvel
attrTipoRules: {
"Casa": [
{ fn: "upsertAttr", key: "tipo", value: "Casa/Sobrado" },
{ fn: "upsertAttr", key: "subtipo", value: "Casa" }
],
"Apartamento": [
{ fn: "upsertAttr", key: "tipo", value: "Apartamento" },
{ fn: "upsertAttr", key: "subtipo", value: "Apartamento" }
]
},
// Regras baseadas em tags
tagsRules: {
"rural": [
{ fn: "addTags", list: ["zona-rural"] }
]
}
};
const transformedProperty = propertyV3CustomMapper(property, mapRules);
```
- **upsertAttr**: Adiciona ou atualiza atributo
- **removeAttr**: Remove atributo
- **addTags**: Adiciona tags
- **removeTags**: Remove tags
```typescript
const advancedRules = {
attributesRules: [
{
key: "dormitorios",
condition: { gte: 3 }, // >= 3
rules: [
{ fn: "addTags", list: ["casa-grande"] }
]
},
{
key: "operacao",
condition: { has_any: ["venda", "locacao"] },
rules: [
{ fn: "upsertAttr", key: "disponivel", value: true }
]
}
]
};
```
**Operadores suportados**: `eq`, `not_eq`, `has`, `has_any`, `not_has`, `gt`, `gte`, `lt`, `lte`
```typescript
import { verifyAttrKeyInPropertyV3Model } from '@horizon-labs/property-model-v3';
const attr = verifyAttrKeyInPropertyV3Model("dormitorios");
// Retorna o modelo do atributo se existir
```
```typescript
import { mergePropertyAttributesModel } from '@horizon-labs/property-model-v3';
const customModel = mergePropertyAttributesModel(
PropertyAttributesModel,
[
{ key: "dormitorios", label: "Quartos" }, // Override
{ key: "piscina", label: "Piscina", type: "Boolean" } // Novo
]
);
```
```typescript
import { sortAttributes } from '@horizon-labs/property-model-v3';
const sorted = sortAttributes(attributes, ["order:asc", "label:desc"]);
```
```typescript
import { preparaAttrValueLabel } from '@horizon-labs/property-model-v3';
preparaAttrValueLabel(["venda", "locacao"]);
// Retorna: "venda e locacao"
preparaAttrValueLabel(["venda", "locacao", "temporada"]);
// Retorna: "venda, locacao e temporada"
```
```typescript
import { unitListModel } from '@horizon-labs/property-model-v3';
// Unidades de área
unitListModel.area; // [{ key: "m²", label: "m²" }, ...]
// Unidades monetárias
unitListModel.currency; // [{ key: "BRL", label: "R$", locale: "pt-BR" }]
// Unidades de comprimento
unitListModel.length; // [{ key: "m", label: "m" }, ...]
```
```typescript
// Dados vindos de API externa
const externalData = {
tipo: "Casa de Condomínio",
quartos: 3,
price: 450000
};
// Normalização para padrão v3
const property = {
reference: "EXT001",
attributes: [
{ key: "tipo", value: externalData.tipo },
{ key: "dormitorios", value: externalData.quartos },
{ key: "valor_venda", value: externalData.price, unit: "BRL" }
],
// ... outros campos
};
const rules = {
attrTipoRules: {
"Casa de Condomínio": [
{ fn: "upsertAttr", key: "tipo", value: "Casa/Sobrado" },
{ fn: "upsertAttr", key: "subtipo", value: "Casa" },
{ fn: "addTags", list: ["em-condominio"] }
]
}
};
const normalized = propertyV3CustomMapper(property, rules);
```
```typescript
// Encontrar atributos por categoria
const valorFields = PropertyAttributesModel.filter(attr => attr.cat === "valores");
// Encontrar atributos com unidade específica
const areaFields = PropertyAttributesModel.filter(attr => attr.unit === "m²");
```
Módulo totalmente tipado com interfaces exportadas:
```typescript
import type {
PropertyType,
Attribute,
PropertyAttribute,
PropertyObject,
MapRules,
MapAction
} from '@horizon-labs/property-model-v3';
```
O módulo inclui testes abrangentes:
```bash
pnpm test
pnpm test:coverage
```
MIT - veja [LICENSE](LICENSE) para detalhes.
---
**Desenvolvido pela Horizon Labs** 🏗️