npm package: @horizon-integrations/publisher-crm
Description: Integração da Imobland Horizon com a Publisher CRM
Author: Horizon Modules
Latest version: 2.0.18

# @horizon-integrations/publisher-crm

Integração da Imobland Horizon com a Publisher CRM. Converte dados de imóveis do formato Publisher para o formato Horizon Property V3.

## Instalação

```bash
npm install @horizon-integrations/publisher-crm
# ou
pnpm add @horizon-integrations/publisher-crm
```

## Uso Básico

```typescript
import {
  convertPublisherToHorizonV3,
  PublisherPropertySchema,
  HorizonPropertySchemaByPublisherZod,
} from "@horizon-integrations/publisher-crm"

// Dados vindos da API Publisher
const publisherData = {
  reference: "PUB-001",
  title: "Apartamento 3 quartos Centro",
  description: "Lindo apartamento com vista",
  model: "Apartamento",
  type: "Padrão",
  operation: "sale",
  values: {
    bedrooms: 3,
    suites: 1,
    bathrooms: 2,
    garage: 2,
    "total-area": 120.5,
    pool: true,
    elevator: true,
    "accepts-financing": true,
  },
  media: {
    pictures: [...],
    videos: [...],
    tour360: [...],
  },
  agent: {
    id: "123",
    name: "João Silva",
  },
  tags: ["destaque", "novo"],
  updated_at: "2025-11-16T10:00:00.000Z",
}

// Validar entrada (opcional)
const validatedInput = PublisherPropertySchemaZod.parse(publisherData)

// Converter para formato Horizon
const horizonProperty = convertPublisherPropertyToHorizon(validatedInput)

// Validar saída (opcional)
const validatedOutput = HorizonPropertySchemaByPublisherZod.parse(horizonProperty)
```

## Estrutura de Dados

### Entrada (Publisher)

```typescript
{
  reference: string           // Código de referência
  title: string               // Título do anúncio
  description: string         // Descrição
  model: string               // Modelo (ex: "Apartamento", "Casa")
  type: string                // Tipo (ex: "Padrão", "Sobrado")
  operation: string           // Operação: "sale" | "rent" | "season"
  values: {                   // Atributos do imóvel
    bedrooms: number
    suites: number
    bathrooms: number
    garage: number
    "total-area": number
    pool: boolean
    elevator: boolean
    "accepts-financing": boolean
    // ... 140+ campos
  }
  media: {
    pictures: Picture[]
    videos: Video[]
    tour360: Tour360[]
  }
  agent?: {
    id: string | number
    name: string
  }
  tags: string[] | string
  updated_at: string
}
```

### Saída (Horizon Property V3)

76 campos no total:
- **54 campos base** (padrão Horizon)
- **22 campos estendidos** (específicos Publisher)

```typescript
{
  // Identificação
  reference: string
  title: string
  description: string
  tipo: string              // model → tipo
  subtipo: string           // type → subtipo
  operacao: string[]        // ["venda"] | ["locacao"] | ["temporada"]

  // Áreas
  area_total: number
  area_privativa: number
  area_util: number
  area_construida: number   // campo estendido

  // Dependências
  dormitorios: number
  suites: number
  banheiros: number
  vagas_garagem: number

  // Localização
  endereco_cep: string
  endereco_estado: string
  endereco_cidade: string
  endereco_bairro: string
  endereco_logradouro: string
  endereco_numero: string
  latitude: number
  longitude: number

  // Valores
  valor_iptu: number
  valor_condominio: number
  valor_seguro_incendio: number  // campo estendido
  valor_pcf: number              // campo estendido

  // Características (array de strings)
  caracteristicas: string[]      // piscina, elevador, churrasqueira, etc.

  // Situações legais/burocráticas (array de strings)
  situacoes: string[]            // aceita_financiamento, vendido, averbado, etc.

  // Estrutura (campos estendidos)
  andar: number
  andares: number
  tipo_piso: string
  tipo_teto: string
  tipo_pintura: string
  tipo_material: string
  tipo_esquadrias: string
  ano_construcao: number
  status_imovel: string

  // Terreno (campos estendidos)
  terreno_solo: string
  terreno_nivel: string
  terreno_cercado: string
  terreno_vegetacao: string
  orientacao_solar: string

  // Rural (campos estendidos)
  rural_hectares: number
  rural_alqueires: number

  // Mídia
  images: Image[]
  videos: Video[]
  virtual_tours: Tour[]
  main_image: Image

  // Corretor
  corretor_key: string
  corretor_nome: string

  // ... e mais
}
```

## Mapeamento de Campos

### Tipo e Subtipo
- `model` → `tipo` (categoria principal: Apartamento, Casa, Terreno)
- `type` → `subtipo` (subcategoria: Padrão, Sobrado, Cobertura)

### Operação
- `sale` → `["venda"]`
- `rent` → `["locacao"]`
- `season` → `["temporada"]`

### Booleanos Físicos → `caracteristicas[]`
Booleanos como `pool`, `elevator`, `barbecue`, `sauna`, etc. são convertidos para strings no array `caracteristicas`:
```typescript
// Entrada
{ pool: true, elevator: true, barbecue: true }

// Saída
{ caracteristicas: ["piscina", "elevador", "churrasqueira"] }
```

### Booleanos Legais → `situacoes[]`
Booleanos como `accepts-financing`, `sold`, `averbado`, etc. são convertidos para strings no array `situacoes`:
```typescript
// Entrada
{ "accepts-financing": true, averbado: true, sold: false }

// Saída
{ situacoes: ["aceita_financiamento", "averbado"] }
```

### Endereço
- `city: "Ponta Grossa - PR"` → `endereco_cidade: "Ponta Grossa"`, `endereco_estado: "PR"`
- `geo-position: "-25.09, -50.16"` → `latitude: -25.09`, `longitude: -50.16`

## Scripts

```bash
# Build
pnpm build

# Verificar tipos
pnpm typecheck

# Executar testes
pnpm test

# Gerar schema Zod (após modificar schema TypeScript)
pnpm generate:zod
```

## Exports

```typescript
// Função de conversão
export { convertPublisherPropertyToHorizon }

// Schema TypeScript (SSOT)
export { HorizonPropertySchemaByPublisher }

// Schemas Zod
export { PublisherPropertySchemaZod, type PublisherPropertySchemaType }
export { HorizonPropertySchemaByPublisherZod, type HorizonPropertySchemaByPublisherType }
```

## Dependências

- `@horizon-domains/property-model`: ^3.9.9
- `zod`: ^3.25.67

## Licença

MIT