@horizon-modules/property-model-v3
Version:
Modelo de propriedades imobiliárias v3 - Sistema de atributos dinâmicos
291 lines (259 loc) • 8.98 kB
Markdown
# 🔧 Configuração de Desenvolvimento - Property Model V3
## 📁 Estrutura de Diretórios Target
```
property-model-v3/
├── __dev__/ # 🚧 CRIAR
│ ├── data/ # 🚧 CRIAR
│ │ ├── arbo-downloads/ # Dados reais convertidos do Arbo
│ │ ├── fake-data-output/ # Dados fake gerados
│ │ ├── mock-output/ # Mocks para testes
│ │ └── profiling-report.json # Análise estatística
│ ├── scripts/ # 🚧 CRIAR
│ │ ├── download-from-arbo.ts # Baixa e converte do Arbo
│ │ ├── profile-properties.ts # Faz profiling
│ │ ├── generate-fake-data.ts # Gera dados fake
│ │ └── generate-mocks.ts # Gera mocks
│ ├── services/ # 🚧 CRIAR
│ │ ├── ArboDownloaderService.ts
│ │ ├── ProfilerService.ts
│ │ ├── FakeDataGeneratorService.ts
│ │ └── MockGeneratorService.ts
│ └── tests/ # 🚧 CRIAR
│ ├── arboDownloaderService.test.ts
│ ├── profilerService.test.ts
│ ├── fakeDataGeneratorService.test.ts
│ └── mockGeneratorService.test.ts
├── docs/ # ✅ EXISTE
│ ├── REFATORACAO_PROPERTY_MODEL_V3.md
│ ├── CHECKLIST_IMPLEMENTACAO.md
│ └── CONFIGURACAO_DEV.md
├── src/ # ✅ EXISTE (modificar)
│ ├── data/ # 🚧 CRIAR
│ │ ├── fake-data/ # Dados fake selecionados
│ │ ├── examples/ # Exemplos reais
│ │ └── profiling/ # Dados de profiling
│ ├── fake-data-generator/ # ✅ EXISTE (modificar)
│ ├── custom-mapper/ # ✅ EXISTE
│ ├── models/ # ✅ EXISTE
│ └── tests/ # ✅ EXISTE (modificar)
└── ❌ assets/ (REMOVIDO)
```
## 🔗 Dependências Necessárias
### **package.json alterações**
```json
{
"dependencies": {
"@horizon-modules/arbo-crm-integration": "^2.0.1",
"ramda": "^0.30.0",
"zod": "^3.25.67"
},
"devDependencies": {
"@types/ramda": "^0.30.0",
"tsup": "^8.0.0",
"typescript": "^5.0.0",
"tsx": "^4.0.0",
"vitest": "^1.0.0"
},
"scripts": {
"build": "tsup",
"dev": "tsup --watch",
"test": "vitest",
"test:coverage": "vitest --coverage",
"typecheck": "tsc --noEmit",
// 🚧 NOVOS SCRIPTS DEV
"dev:download": "tsx __dev__/scripts/download-from-arbo.ts",
"dev:profile": "tsx __dev__/scripts/profile-properties.ts",
"dev:fake": "tsx __dev__/scripts/generate-fake-data.ts",
"dev:mocks": "tsx __dev__/scripts/generate-mocks.ts",
"dev:all": "npm run dev:download && npm run dev:profile && npm run dev:fake && npm run dev:mocks",
"dev:test": "vitest __dev__/tests/ --run"
},
"files": [
"dist",
"docs"
]
}
```
## 🖼️ URLs do Unsplash (Substituindo assets locais)
### **Categorias de Imagens**
```typescript
const UNSPLASH_IMAGES = {
apartamento: [
"https://images.unsplash.com/photo-1502672260266-1c1ef2d93688?w=800&q=80",
"https://images.unsplash.com/photo-1522708323590-d24dbb6b0267?w=800&q=80",
"https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=800&q=80",
"https://images.unsplash.com/photo-1565183997392-2f6f122e5912?w=800&q=80"
],
casa: [
"https://images.unsplash.com/photo-1512917774080-9991f1c4c750?w=800&q=80",
"https://images.unsplash.com/photo-1568605114967-8130f3a36994?w=800&q=80",
"https://images.unsplash.com/photo-1570129477492-45c003edd2be?w=800&q=80",
"https://images.unsplash.com/photo-1583608205776-bfd35f0d9f83?w=800&q=80"
],
comercial: [
"https://images.unsplash.com/photo-1497366216548-37526070297c?w=800&q=80",
"https://images.unsplash.com/photo-1524758631624-e2822e304c36?w=800&q=80",
"https://images.unsplash.com/photo-1462826303086-329426d1aef5?w=800&q=80",
"https://images.unsplash.com/photo-1497366811353-6870744d04b2?w=800&q=80"
],
terreno: [
"https://images.unsplash.com/photo-1500382017468-9049fed747ef?w=800&q=80",
"https://images.unsplash.com/photo-1416331108676-a22ccb276e35?w=800&q=80",
"https://images.unsplash.com/photo-1564013799919-ab600027ffc6?w=800&q=80",
"https://images.unsplash.com/photo-1448630360428-65456885c650?w=800&q=80"
],
interior: [
"https://images.unsplash.com/photo-1556909114-f6e7ad7d3136?w=800&q=80",
"https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=800&q=80",
"https://images.unsplash.com/photo-1555041469-a586c61ea9bc?w=800&q=80"
]
}
```
## ⚙️ Configurações dos Serviços
### **ArboDownloaderService Config**
```typescript
interface ArboDownloadConfig {
startPage: number // 1
endPage: number // 5
perPage: number // 50
outputDir: string // "__dev__/data/arbo-downloads"
convertToPropertyModel: boolean // true
validateWithZod: boolean // true
}
```
### **ProfilerService Config**
```typescript
interface ProfilerConfig {
inputDir: string // "__dev__/data/arbo-downloads"
outputFile: string // "__dev__/data/profiling-report.json"
fieldConfigs: {
[fieldName: string]: {
maxExamples: number // Quantos exemplos por campo
}
}
defaultMaxExamples: number // 10
}
```
### **FakeDataGeneratorService Config**
```typescript
interface FakeDataConfig {
profilePath: string // "__dev__/data/profiling-report.json"
outputDir: string // "__dev__/data/fake-data-output"
counts: {
apartamentos: number // 25
casas: number // 20
comerciais: number // 15
terrenos: number // 10
}
useUnsplash: boolean // true
validateWithZod: boolean // true
}
```
### **MockGeneratorService Config**
```typescript
interface MockConfig {
profilePath: string // "__dev__/data/profiling-report.json"
outputDir: string // "__dev__/data/mock-output"
validCount: number // 10
problematicCount: number // 5
validateWithZod: boolean // true (só para válidos)
}
```
## 🗂️ Formato dos Dados
### **Profiling Report**
```json
{
"tipo": ["Casa", "Apartamento", "Terreno", "Comercial"],
"operacao": [["venda"], ["locacao"], ["venda", "locacao"]],
"dormitorios": [1, 2, 3, 4, 5],
"valor_venda": [200000, 350000, 500000, 750000],
"endereco_cidade": ["São Paulo", "Rio de Janeiro", "Curitiba"],
"endereco_estado": ["SP", "RJ", "PR"],
// ... mais campos
}
```
### **PropertyModel Fake Data**
```json
{
"reference": "FAKE_CASA_001",
"title": "Casa em Pinheiros - 3 dorms, 150m²",
"description": "Excelente casa em localização privilegiada...",
"attributes": {
"tipo": "Casa",
"operacao": ["venda"],
"dormitorios": 3,
"valor_venda": 850000,
"endereco_cidade": "São Paulo"
// ... outros atributos
},
"media_assets": {
"images": [
{
"full": "https://images.unsplash.com/photo-1512917774080-9991f1c4c750?w=800&q=80",
"md": "https://images.unsplash.com/photo-1512917774080-9991f1c4c750?w=640&q=80",
"sm": "https://images.unsplash.com/photo-1512917774080-9991f1c4c750?w=320&q=80",
"cover": true
}
],
"videos": [],
"virtual_tours": [],
"documents": []
},
"settings": {
"currency_unit": "BRL",
"area_unit": "m2",
"exibir_no_mapa": true
},
"updated_at": "2025-07-08T20:30:00.000Z"
}
```
## 🔧 .gitignore Atualizações
```gitignore
# Development data (não commitar dados baixados)
__dev__/data/arbo-downloads/
__dev__/data/fake-data-output/
__dev__/data/mock-output/
__dev__/data/profiling-report.json
# Manter estrutura mas não dados
!__dev__/data/.gitkeep
!__dev__/data/*/
!__dev__/data/*/.gitkeep
# Logs
__dev__/logs/
```
## 🎯 Casos de Uso Principais
### **1. Desenvolvedor quer dados fake para testar**
```bash
# Gerar dados fake rapidamente
npm run dev:fake
# Dados ficam em __dev__/data/fake-data-output/
```
### **2. Desenvolvedor quer dados reais para análise**
```bash
# Baixar dados reais do Arbo e converter
npm run dev:download
# Dados ficam em __dev__/data/arbo-downloads/
```
### **3. Desenvolvedor quer criar mocks para testes**
```bash
# Gerar mocks baseados em profiling
npm run dev:mocks
# Mocks ficam em __dev__/data/mock-output/
```
### **4. Pipeline completo de dados**
```bash
# Executar pipeline completo
npm run dev:all
# 1. Baixa dados do Arbo
# 2. Faz profiling
# 3. Gera dados fake
# 4. Gera mocks
```
### **5. Testar nova implementação**
```bash
# Rodar testes dos serviços de dev
npm run dev:test
# Todos os testes usam pastas temporárias
```
---
*Configuração atualizada em: 2025-07-08*