npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

@horizon-modules/arbo-crm-integration

v2.0.6

Published

Integração CRM Arbo para conversion de dados imobiliários para property-model-v3

Downloads

39

Readme

@horizon-modules/arbo-crm-integration

Integração completa com o CRM Arbo para sincronização e conversão de dados imobiliários para o formato PropertyModelV3.

🏠 O que faz

Este pacote oferece uma solução completa para integrar sistemas imobiliários com a API do Arbo CRM:

  • Download automático de imóveis da API Arbo
  • Conversão de dados Arbo para PropertyModelV3
  • Upload para sua API própria
  • Profiling genérico de datasets JSON
  • Dados de teste para desenvolvimento

📦 Instalação

npm install @horizon-modules/arbo-crm-integration
# ou
pnpm add @horizon-modules/arbo-crm-integration

🚀 Uso Rápido (v2.0.4+)

✅ Uso Mais Simples (Recomendado)

// ESM (TypeScript/Módulos modernos)
import { ArboDownloader } from '@horizon-modules/arbo-crm-integration'

// CommonJS (JavaScript tradicional)
const { ArboDownloader } = require('@horizon-modules/arbo-crm-integration')

// 🎯 Configuração mínima - baseUrl é OPCIONAL!
const downloader = new ArboDownloader({
  token: 'seu_token_arbo',
  outputDir: './data/imoveis'
  // baseUrl: automático (https://app-integracao.arboimoveis.com/api)
})

// Download simples
const result = await downloader.downloadPages({
  startPage: 1,
  endPage: 5,
  perPage: 50
})

🔧 Configuração Completa (Opcional)

import { 
  ArboDownloader, 
  ArboApiClient, 
  ProfilerService,
  convertArboToPropertyV3,
  testMocks,
  fakeData
} from '@horizon-modules/arbo-crm-integration'

// Configuração com baseUrl customizado (opcional)
const downloader = new ArboDownloader({
  token: 'seu_token_arbo',
  outputDir: './data/imoveis',
  baseUrl: 'https://app-integracao.arboimoveis.com/api' // Opcional
})

const result = await downloader.downloadPages({
  startPage: 1,
  endPage: 5,
  perPage: 50
})

// 2. Upload para sua API
await downloader.uploadToApi({
  endpoint: 'https://sua-api.com/imoveis',
  headers: { 'Authorization': 'Bearer seu_token' }
})

// 3. Conversão manual
const imovelArbo = await new ArboApiClient({ token }).getImovel(123)
const propertyV3 = convertArboToPropertyV3(imovelArbo)

// 4. Profiling de dados
const profiler = new ProfilerService({
  inputDir: './data',
  outputDir: './output',
  fieldConfigs: {
    'categoria': { maxExamples: 5 },
    'end_bairro': { maxExamples: 20 }
  }
})

const profile = await profiler.profile()
console.log(profile.categoria) // ['Casa', 'Apartamento', ...]

🛠️ API

ArboDownloader

Principais métodos:

  • downloadPage(page, perPage) - Baixa uma página específica
  • downloadPages(options) - Baixa múltiplas páginas
  • uploadToApi(config) - Envia dados para sua API
  • downloadAndUpload(downloadOpts, uploadOpts) - Operação completa

Configuração:

interface ArboDownloaderConfig {
  token: string        // Token da API Arbo (obrigatório)
  outputDir: string    // Pasta onde salvar arquivos (obrigatório)
  baseUrl?: string     // URL base da API (OPCIONAL - padrão: https://app-integracao.arboimoveis.com/api)
}

🆕 Melhorias na v2.0.4

baseUrl agora é opcional - usa valor padrão automaticamente
Compatibilidade ESM/CommonJS - funciona com import e require
Melhor documentação - exemplos mais claros
Exports corrigidos - melhor suporte TypeScript

ArboApiClient

Principais métodos:

  • getImoveis(page?, perPage?) - Lista imóveis
  • getImovel(id) - Busca imóvel específico
  • searchImoveis(params, page?, perPage?) - Busca com filtros
  • getAllPages(perPage?) - Baixa todas as páginas

ProfilerService

Ferramenta genérica para análise de datasets JSON:

const profiler = new ProfilerService({
  inputDir: './dados',           // Pasta com arquivos JSON
  outputDir: './saida',         // Onde salvar o relatório  
  fieldConfigs: {
    campo1: { maxExamples: 5 },  // Máximo 5 exemplos
    campo2: { maxExamples: 10 }  // Máximo 10 exemplos
  },
  defaultMaxExamples: 3         // Padrão para outros campos
})

const resultado = await profiler.profile()
// Resultado: { campo1: [valores únicos], campo2: [...] }

Características:

  • Genérico - funciona com qualquer estrutura JSON
  • Arrays concatenados - junta valores de arrays de vários objetos
  • Objetos aninhados - preserva hierarquia (corretor.nome)
  • Ordem alfabética - campos organizados automaticamente
  • Configurável - controle de quantos exemplos por campo

Dados de Teste

import { testMocks, fakeData } from '@horizon-modules/arbo-crm-integration'

// Mocks para testes
const validData = testMocks.validos      // Dados válidos para testes
const problematicData = testMocks.problematicos  // Casos edge

// Dados falsos para desenvolvimento
const apartments = fakeData.apartamentos
const houses = fakeData.casas
const commercial = fakeData.comerciais  
const land = fakeData.terrenos

🔧 Configuração via .env

# === ARBO API ===
ARBO_TOKEN=seu_token_arbo
ARBO_START_PAGE=1
ARBO_END_PAGE=10
ARBO_PER_PAGE=50

# === SUA API ===
API_ENDPOINT=https://sua-api.com/imoveis
API_TOKEN=seu_bearer_token
API_BATCH_SIZE=10

# === OPERAÇÃO ===
OPERATION_MODE=download-and-upload  # download-only | upload-only | download-and-upload
DATA_DIR=./data/arbo-imports

📁 Estrutura de Dados

Entrada (Arbo)

{
  "ref_id": 3015393,
  "codigo": "SO0001_TB",
  "titulo": "Sobrado à venda 2 Quadras do lago",
  "categoria": "Sobrado",
  "finalidade": "Venda",
  "ativo": true,
  "publicado": true,
  "valor_venda": 510000,
  "qtd_quartos": 3,
  "qtd_banheiro": 2,
  "qtd_suites": 1,
  "qtd_vagas": 2,
  "area_total": 100,
  "area_privativa": 98.25,
  "end_bairro": "Oficinas",
  "end_cidade": "Ponta Grossa",
  "end_estado": "PR",
  "end_cep": "84036140",
  "fotos": [
    {
      "url": "https://static.arboimoveis.com.br/SO0001_TB/sobrado_1683719500639.jpeg",
      "ordem": 0,
      "principal": true,
      "marcadagua_url": "https://...",
      "sizes": {
        "medium": "https://...640x480/...",
        "small": "https://...320x240/..."
      }
    }
  ],
  "corretor": {
    "codigo": 908223,
    "nome": "Fabiano Garbuio",
    "telefones": ["42998000149"]
  }
}

Saída (PropertyV3)

{
  "reference": "SO0001_TB",
  "title": "Sobrado à venda 2 Quadras do lago",
  "description": "Residencial com seis sobrados, todos independentes...",
  "media_assets": {
    "images": [
      {
        "full": "https://static.arboimoveis.com.br/SO0001_TB/sobrado_1683719500639.jpeg",
        "md": "https://static.arboimoveis.com.br/SO0001_TB/640x480/sobrado_1683719500639.jpeg",
        "sm": "https://static.arboimoveis.com.br/SO0001_TB/320x240/sobrado_1683719500639.jpeg",
        "cover": true
      }
    ],
    "videos": [{"embed_url": "https://youtu.be/96d17X77UZo"}]
  },
  "attributes": {
    "operacao": ["Venda"],
    "valor_venda": 510000,
    "area_total": 100,
    "area_util": 98.25,
    "dormitorios": 3,
    "suites": 1,
    "banheiros": 2,
    "vagas": 2,
    "tipo": "Sobrado",
    "finalidade": "Residencial",
    "endereco_cep": "84036140",
    "endereco_estado": "PR",
    "endereco_cidade": "Ponta Grossa",
    "endereco_bairro": "Oficinas",
    "endereco_logradouro": "Rua Mathias de Albuquerque",
    "endereco_numero": 179,
    "mobiliado": false,
    "financiavel": true
  },
  "settings": {
    "currency_unit": "BRL",
    "area_unit": "m2",
    "exibir_no_mapa": true
  }
}

Profiling

{
  "categoria": ["Casa", "Apartamento", "Terreno"],
  "corretor.nome": ["João Silva", "Maria Santos"],
  "corretor.telefones": ["11999999999", "21888888888"],
  "fotos.url": ["foto1.jpg", "foto2.jpg", "foto3.jpg"]
}

🧪 Desenvolvimento

# Instalar dependências
pnpm install

# Build
pnpm build

# Testes
pnpm test

# Typecheck
pnpm typecheck

Scripts de Desenvolvimento

# Download de propriedades reais
node __dev__/scripts/download-properties.js

# Profiling dos dados baixados  
node __dev__/scripts/profile-properties.js

# Gerar dados falsos
pnpm tsx __dev__/scripts/generate-fake-data.ts

# Gerar mocks para testes
pnpm tsx __dev__/scripts/generate-mocks.ts

🎯 Casos de Uso

1. Sincronização Automática

Script diário para manter seu sistema atualizado com dados do Arbo.

2. Migração de Dados

Conversão em lote de propriedades existentes do Arbo para seu formato.

3. Análise de Dados

Profiling para entender estrutura e qualidade dos dados imobiliários.

4. Desenvolvimento

Dados falsos e mocks para testes e desenvolvimento local.

📝 Licença

MIT

🤝 Contribuição

Este é um pacote interno da Horizon Labs. Para suporte, abra uma issue no repositório principal.