@horizon-integrations/jetimob-crm
Version:
Adapter de integração com o CRM Jetimob — padrão Airbyte (@horizon-js/integrations-core)
1,087 lines (1,079 loc) • 85.4 kB
text/typescript
import * as _horizon_js_integrations_core from '@horizon-js/integrations-core';
import { Source, CheckResult, Stream, HttpStream, IncrementalStream, SyncMode, RetryOptions, SyncState, ListingEntry as ListingEntry$1, SourceManifest, SourceSpec } from '@horizon-js/integrations-core';
import { z } from 'zod';
import { EntitySchema } from '@horizon-js/property-domain-schema';
/**
* Tipos compartilhados do pacote @horizon-integrations/jetimob-crm.
*/
/**
* Credenciais pra autenticar na API Jetimob.
*
* A Jetimob não usa header nem token OAuth — a autenticação é a própria
* `webserviceKey` embutida no PATH da URL:
* `https://api.jetimob.com/webservice/{webserviceKey}/imoveis`
*
* Obtida no painel Jetimob da imobiliária. É o único dado de auth necessário.
*
* > Nota: a API Jetimob também expõe um par chave-pública/chave-privada pra
* > envio de leads. Quando o writer de leads for implementado, essas chaves
* > entram aqui como campos opcionais.
*/
interface JetimobCredentials {
readonly webserviceKey: string;
}
interface JetimobSourceOptions {
/** URL base da API. Default: `https://api.jetimob.com`. */
readonly baseUrl?: string;
}
/**
* Source da Jetimob — implementação do contrato `Source<JetimobCredentials>`
* do `@horizon-js/integrations-core`.
*
* Expõe:
* - `manifest` — cartão declarativo (metadata, capabilities, knownIssues, streams)
* - `spec` — JSON Schema das credenciais
* - `check(config)` — valida a `webserviceKey` com o request mais barato possível
* - `streams(config)` — retorna `[JetimobPropertyStream]`
*
* A Jetimob é só-leitura (por enquanto) — não implementa `writers()`.
*
* ## Uso
*
* ```ts
* import { JetimobSource } from "@horizon-integrations/jetimob-crm"
* import { SyncMode } from "@horizon-js/integrations-core"
*
* const source = new JetimobSource()
*
* // 1. Valida credenciais
* const { ok } = await source.check({ webserviceKey: "..." })
* if (!ok) throw new Error("webserviceKey inválida")
*
* // 2. Lê imóveis (streaming, paginação automática)
* const [stream] = source.streams({ webserviceKey: "..." })
* for await (const property of stream.readRecords(SyncMode.FULL_REFRESH)) {
* await db.properties.upsert(property)
* }
* ```
*
* Pra uso de alto nível (sem mexer com streams), veja as funções de
* conveniência `fetchAll` / `getListing` / `fetchByRef` exportadas pelo pacote.
*/
declare class JetimobSource implements Source<JetimobCredentials> {
private readonly options;
readonly name = "jetimob";
readonly manifest: _horizon_js_integrations_core.SourceManifest<JetimobCredentials>;
readonly spec: _horizon_js_integrations_core.SourceSpec<JetimobCredentials>;
constructor(options?: JetimobSourceOptions);
check(config: JetimobCredentials): Promise<CheckResult>;
streams(config: JetimobCredentials): Stream<unknown>[];
}
declare const HorizonPropertySchemaByJetimobZod: z.ZodObject<Omit<{
currency: z.ZodDefault<z.ZodString>;
unit_area: z.ZodDefault<z.ZodString>;
unit_distance: z.ZodDefault<z.ZodEnum<["meters", "km"]>>;
reference: z.ZodString;
title: z.ZodString;
description: z.ZodString;
seo_slug: z.ZodOptional<z.ZodNullable<z.ZodString>>;
seo_title: z.ZodOptional<z.ZodNullable<z.ZodString>>;
seo_description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
seo_keywords: z.ZodOptional<z.ZodNullable<z.ZodString>>;
main_image: z.ZodOptional<z.ZodObject<{
md: z.ZodString;
sm: z.ZodString;
full: z.ZodString;
}, "strip", z.ZodTypeAny, {
md: string;
sm: string;
full: string;
}, {
md: string;
sm: string;
full: string;
}>>;
images: z.ZodArray<z.ZodObject<{
md: z.ZodString;
sm: z.ZodString;
full: z.ZodString;
cover: z.ZodBoolean;
}, "strip", z.ZodTypeAny, {
md: string;
sm: string;
full: string;
cover: boolean;
}, {
md: string;
sm: string;
full: string;
cover: boolean;
}>, "many">;
videos: z.ZodArray<z.ZodObject<{
url: z.ZodOptional<z.ZodNullable<z.ZodString>>;
}, "strip", z.ZodTypeAny, {
url?: string | null | undefined;
}, {
url?: string | null | undefined;
}>, "many">;
virtual_tours: z.ZodArray<z.ZodObject<{
embed_url: z.ZodString;
}, "strip", z.ZodTypeAny, {
embed_url: string;
}, {
embed_url: string;
}>, "many">;
operacao: z.ZodArray<z.ZodEnum<["venda", "locacao", "temporada"]>, "many">;
tipo: z.ZodString;
dormitorios: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
suites: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
banheiros: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
vagas_garagem: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
area_total: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
area_privativa: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
area_util: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
destaque: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
valor_venda: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
valor_locacao: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
valor_condominio: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
valor_iptu: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
endereco_cep: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_estado: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_cidade: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_bairro: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_logradouro: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_numero: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_complemento: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_referencia: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_zona: z.ZodOptional<z.ZodNullable<z.ZodString>>;
lat: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
lng: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
corretor_key: z.ZodOptional<z.ZodNullable<z.ZodString>>;
corretor_nome: z.ZodOptional<z.ZodNullable<z.ZodString>>;
condominio_key: z.ZodOptional<z.ZodNullable<z.ZodString>>;
condominio_nome: z.ZodOptional<z.ZodNullable<z.ZodString>>;
source_key: z.ZodString;
source_published_at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
source_updated_at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
sync_hash: z.ZodOptional<z.ZodNullable<z.ZodString>>;
}, "main_image" | "images" | "videos" | "virtual_tours"> & {
tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
numero_pessoas: z.ZodOptional<z.ZodNumber>;
valor_diaria: z.ZodOptional<z.ZodNumber>;
geo_aproximado: z.ZodOptional<z.ZodObject<{
lat: z.ZodNumber;
lng: z.ZodNumber;
}, "strip", z.ZodTypeAny, {
lat: number;
lng: number;
}, {
lat: number;
lng: number;
}>>;
id_imovel: z.ZodOptional<z.ZodString>;
finalidade: z.ZodOptional<z.ZodString>;
mobiliado: z.ZodOptional<z.ZodBoolean>;
caracteristicas: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
plantas: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
valor_seguro_incendio: z.ZodOptional<z.ZodNumber>;
valor_taxa_limpeza: z.ZodOptional<z.ZodNumber>;
andar: z.ZodOptional<z.ZodNumber>;
financiavel: z.ZodOptional<z.ZodBoolean>;
exclusividade: z.ZodOptional<z.ZodBoolean>;
permuta: z.ZodOptional<z.ZodBoolean>;
seguro_fianca: z.ZodOptional<z.ZodBoolean>;
situacao: z.ZodOptional<z.ZodString>;
status: z.ZodOptional<z.ZodString>;
distancia_mar: z.ZodOptional<z.ZodNumber>;
posicao: z.ZodOptional<z.ZodString>;
posicao_solar: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
calendario_temporada: z.ZodOptional<z.ZodAny>;
condominio_comodidades: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
condominio_tipo: z.ZodOptional<z.ZodString>;
subcondominio_id: z.ZodOptional<z.ZodString>;
condominio_fechado: z.ZodOptional<z.ZodBoolean>;
entrega_ano: z.ZodOptional<z.ZodNumber>;
entrega_mes: z.ZodOptional<z.ZodNumber>;
tipo_construcao: z.ZodOptional<z.ZodString>;
tipo_piso: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
periodicidade_iptu: z.ZodOptional<z.ZodString>;
terreno_frente: z.ZodOptional<z.ZodNumber>;
terreno_fundos: z.ZodOptional<z.ZodNumber>;
terreno_esquerdo: z.ZodOptional<z.ZodNumber>;
terreno_direita: z.ZodOptional<z.ZodNumber>;
terreno_total: z.ZodOptional<z.ZodNumber>;
rural_area_aravel: z.ZodOptional<z.ZodNumber>;
rural_sedes: z.ZodOptional<z.ZodNumber>;
rural_atividade: z.ZodOptional<z.ZodString>;
}, "passthrough", z.ZodTypeAny, z.objectOutputType<Omit<{
currency: z.ZodDefault<z.ZodString>;
unit_area: z.ZodDefault<z.ZodString>;
unit_distance: z.ZodDefault<z.ZodEnum<["meters", "km"]>>;
reference: z.ZodString;
title: z.ZodString;
description: z.ZodString;
seo_slug: z.ZodOptional<z.ZodNullable<z.ZodString>>;
seo_title: z.ZodOptional<z.ZodNullable<z.ZodString>>;
seo_description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
seo_keywords: z.ZodOptional<z.ZodNullable<z.ZodString>>;
main_image: z.ZodOptional<z.ZodObject<{
md: z.ZodString;
sm: z.ZodString;
full: z.ZodString;
}, "strip", z.ZodTypeAny, {
md: string;
sm: string;
full: string;
}, {
md: string;
sm: string;
full: string;
}>>;
images: z.ZodArray<z.ZodObject<{
md: z.ZodString;
sm: z.ZodString;
full: z.ZodString;
cover: z.ZodBoolean;
}, "strip", z.ZodTypeAny, {
md: string;
sm: string;
full: string;
cover: boolean;
}, {
md: string;
sm: string;
full: string;
cover: boolean;
}>, "many">;
videos: z.ZodArray<z.ZodObject<{
url: z.ZodOptional<z.ZodNullable<z.ZodString>>;
}, "strip", z.ZodTypeAny, {
url?: string | null | undefined;
}, {
url?: string | null | undefined;
}>, "many">;
virtual_tours: z.ZodArray<z.ZodObject<{
embed_url: z.ZodString;
}, "strip", z.ZodTypeAny, {
embed_url: string;
}, {
embed_url: string;
}>, "many">;
operacao: z.ZodArray<z.ZodEnum<["venda", "locacao", "temporada"]>, "many">;
tipo: z.ZodString;
dormitorios: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
suites: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
banheiros: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
vagas_garagem: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
area_total: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
area_privativa: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
area_util: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
destaque: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
valor_venda: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
valor_locacao: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
valor_condominio: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
valor_iptu: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
endereco_cep: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_estado: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_cidade: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_bairro: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_logradouro: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_numero: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_complemento: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_referencia: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_zona: z.ZodOptional<z.ZodNullable<z.ZodString>>;
lat: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
lng: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
corretor_key: z.ZodOptional<z.ZodNullable<z.ZodString>>;
corretor_nome: z.ZodOptional<z.ZodNullable<z.ZodString>>;
condominio_key: z.ZodOptional<z.ZodNullable<z.ZodString>>;
condominio_nome: z.ZodOptional<z.ZodNullable<z.ZodString>>;
source_key: z.ZodString;
source_published_at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
source_updated_at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
sync_hash: z.ZodOptional<z.ZodNullable<z.ZodString>>;
}, "main_image" | "images" | "videos" | "virtual_tours"> & {
tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
numero_pessoas: z.ZodOptional<z.ZodNumber>;
valor_diaria: z.ZodOptional<z.ZodNumber>;
geo_aproximado: z.ZodOptional<z.ZodObject<{
lat: z.ZodNumber;
lng: z.ZodNumber;
}, "strip", z.ZodTypeAny, {
lat: number;
lng: number;
}, {
lat: number;
lng: number;
}>>;
id_imovel: z.ZodOptional<z.ZodString>;
finalidade: z.ZodOptional<z.ZodString>;
mobiliado: z.ZodOptional<z.ZodBoolean>;
caracteristicas: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
plantas: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
valor_seguro_incendio: z.ZodOptional<z.ZodNumber>;
valor_taxa_limpeza: z.ZodOptional<z.ZodNumber>;
andar: z.ZodOptional<z.ZodNumber>;
financiavel: z.ZodOptional<z.ZodBoolean>;
exclusividade: z.ZodOptional<z.ZodBoolean>;
permuta: z.ZodOptional<z.ZodBoolean>;
seguro_fianca: z.ZodOptional<z.ZodBoolean>;
situacao: z.ZodOptional<z.ZodString>;
status: z.ZodOptional<z.ZodString>;
distancia_mar: z.ZodOptional<z.ZodNumber>;
posicao: z.ZodOptional<z.ZodString>;
posicao_solar: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
calendario_temporada: z.ZodOptional<z.ZodAny>;
condominio_comodidades: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
condominio_tipo: z.ZodOptional<z.ZodString>;
subcondominio_id: z.ZodOptional<z.ZodString>;
condominio_fechado: z.ZodOptional<z.ZodBoolean>;
entrega_ano: z.ZodOptional<z.ZodNumber>;
entrega_mes: z.ZodOptional<z.ZodNumber>;
tipo_construcao: z.ZodOptional<z.ZodString>;
tipo_piso: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
periodicidade_iptu: z.ZodOptional<z.ZodString>;
terreno_frente: z.ZodOptional<z.ZodNumber>;
terreno_fundos: z.ZodOptional<z.ZodNumber>;
terreno_esquerdo: z.ZodOptional<z.ZodNumber>;
terreno_direita: z.ZodOptional<z.ZodNumber>;
terreno_total: z.ZodOptional<z.ZodNumber>;
rural_area_aravel: z.ZodOptional<z.ZodNumber>;
rural_sedes: z.ZodOptional<z.ZodNumber>;
rural_atividade: z.ZodOptional<z.ZodString>;
}, z.ZodTypeAny, "passthrough">, z.objectInputType<Omit<{
currency: z.ZodDefault<z.ZodString>;
unit_area: z.ZodDefault<z.ZodString>;
unit_distance: z.ZodDefault<z.ZodEnum<["meters", "km"]>>;
reference: z.ZodString;
title: z.ZodString;
description: z.ZodString;
seo_slug: z.ZodOptional<z.ZodNullable<z.ZodString>>;
seo_title: z.ZodOptional<z.ZodNullable<z.ZodString>>;
seo_description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
seo_keywords: z.ZodOptional<z.ZodNullable<z.ZodString>>;
main_image: z.ZodOptional<z.ZodObject<{
md: z.ZodString;
sm: z.ZodString;
full: z.ZodString;
}, "strip", z.ZodTypeAny, {
md: string;
sm: string;
full: string;
}, {
md: string;
sm: string;
full: string;
}>>;
images: z.ZodArray<z.ZodObject<{
md: z.ZodString;
sm: z.ZodString;
full: z.ZodString;
cover: z.ZodBoolean;
}, "strip", z.ZodTypeAny, {
md: string;
sm: string;
full: string;
cover: boolean;
}, {
md: string;
sm: string;
full: string;
cover: boolean;
}>, "many">;
videos: z.ZodArray<z.ZodObject<{
url: z.ZodOptional<z.ZodNullable<z.ZodString>>;
}, "strip", z.ZodTypeAny, {
url?: string | null | undefined;
}, {
url?: string | null | undefined;
}>, "many">;
virtual_tours: z.ZodArray<z.ZodObject<{
embed_url: z.ZodString;
}, "strip", z.ZodTypeAny, {
embed_url: string;
}, {
embed_url: string;
}>, "many">;
operacao: z.ZodArray<z.ZodEnum<["venda", "locacao", "temporada"]>, "many">;
tipo: z.ZodString;
dormitorios: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
suites: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
banheiros: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
vagas_garagem: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
area_total: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
area_privativa: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
area_util: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
destaque: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
valor_venda: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
valor_locacao: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
valor_condominio: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
valor_iptu: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
endereco_cep: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_estado: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_cidade: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_bairro: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_logradouro: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_numero: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_complemento: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_referencia: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_zona: z.ZodOptional<z.ZodNullable<z.ZodString>>;
lat: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
lng: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
corretor_key: z.ZodOptional<z.ZodNullable<z.ZodString>>;
corretor_nome: z.ZodOptional<z.ZodNullable<z.ZodString>>;
condominio_key: z.ZodOptional<z.ZodNullable<z.ZodString>>;
condominio_nome: z.ZodOptional<z.ZodNullable<z.ZodString>>;
source_key: z.ZodString;
source_published_at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
source_updated_at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
sync_hash: z.ZodOptional<z.ZodNullable<z.ZodString>>;
}, "main_image" | "images" | "videos" | "virtual_tours"> & {
tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
numero_pessoas: z.ZodOptional<z.ZodNumber>;
valor_diaria: z.ZodOptional<z.ZodNumber>;
geo_aproximado: z.ZodOptional<z.ZodObject<{
lat: z.ZodNumber;
lng: z.ZodNumber;
}, "strip", z.ZodTypeAny, {
lat: number;
lng: number;
}, {
lat: number;
lng: number;
}>>;
id_imovel: z.ZodOptional<z.ZodString>;
finalidade: z.ZodOptional<z.ZodString>;
mobiliado: z.ZodOptional<z.ZodBoolean>;
caracteristicas: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
plantas: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
valor_seguro_incendio: z.ZodOptional<z.ZodNumber>;
valor_taxa_limpeza: z.ZodOptional<z.ZodNumber>;
andar: z.ZodOptional<z.ZodNumber>;
financiavel: z.ZodOptional<z.ZodBoolean>;
exclusividade: z.ZodOptional<z.ZodBoolean>;
permuta: z.ZodOptional<z.ZodBoolean>;
seguro_fianca: z.ZodOptional<z.ZodBoolean>;
situacao: z.ZodOptional<z.ZodString>;
status: z.ZodOptional<z.ZodString>;
distancia_mar: z.ZodOptional<z.ZodNumber>;
posicao: z.ZodOptional<z.ZodString>;
posicao_solar: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
calendario_temporada: z.ZodOptional<z.ZodAny>;
condominio_comodidades: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
condominio_tipo: z.ZodOptional<z.ZodString>;
subcondominio_id: z.ZodOptional<z.ZodString>;
condominio_fechado: z.ZodOptional<z.ZodBoolean>;
entrega_ano: z.ZodOptional<z.ZodNumber>;
entrega_mes: z.ZodOptional<z.ZodNumber>;
tipo_construcao: z.ZodOptional<z.ZodString>;
tipo_piso: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
periodicidade_iptu: z.ZodOptional<z.ZodString>;
terreno_frente: z.ZodOptional<z.ZodNumber>;
terreno_fundos: z.ZodOptional<z.ZodNumber>;
terreno_esquerdo: z.ZodOptional<z.ZodNumber>;
terreno_direita: z.ZodOptional<z.ZodNumber>;
terreno_total: z.ZodOptional<z.ZodNumber>;
rural_area_aravel: z.ZodOptional<z.ZodNumber>;
rural_sedes: z.ZodOptional<z.ZodNumber>;
rural_atividade: z.ZodOptional<z.ZodString>;
}, z.ZodTypeAny, "passthrough">>;
type HorizonPropertySchemaByJetimobType = z.infer<typeof HorizonPropertySchemaByJetimobZod>;
declare const validateHorizonPropertySchemaByJetimob: (data: unknown) => HorizonPropertySchemaByJetimobType;
declare const safeValidateHorizonPropertySchemaByJetimob: (data: unknown) => z.SafeParseReturnType<z.objectInputType<Omit<{
currency: z.ZodDefault<z.ZodString>;
unit_area: z.ZodDefault<z.ZodString>;
unit_distance: z.ZodDefault<z.ZodEnum<["meters", "km"]>>;
reference: z.ZodString;
title: z.ZodString;
description: z.ZodString;
seo_slug: z.ZodOptional<z.ZodNullable<z.ZodString>>;
seo_title: z.ZodOptional<z.ZodNullable<z.ZodString>>;
seo_description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
seo_keywords: z.ZodOptional<z.ZodNullable<z.ZodString>>;
main_image: z.ZodOptional<z.ZodObject<{
md: z.ZodString;
sm: z.ZodString;
full: z.ZodString;
}, "strip", z.ZodTypeAny, {
md: string;
sm: string;
full: string;
}, {
md: string;
sm: string;
full: string;
}>>;
images: z.ZodArray<z.ZodObject<{
md: z.ZodString;
sm: z.ZodString;
full: z.ZodString;
cover: z.ZodBoolean;
}, "strip", z.ZodTypeAny, {
md: string;
sm: string;
full: string;
cover: boolean;
}, {
md: string;
sm: string;
full: string;
cover: boolean;
}>, "many">;
videos: z.ZodArray<z.ZodObject<{
url: z.ZodOptional<z.ZodNullable<z.ZodString>>;
}, "strip", z.ZodTypeAny, {
url?: string | null | undefined;
}, {
url?: string | null | undefined;
}>, "many">;
virtual_tours: z.ZodArray<z.ZodObject<{
embed_url: z.ZodString;
}, "strip", z.ZodTypeAny, {
embed_url: string;
}, {
embed_url: string;
}>, "many">;
operacao: z.ZodArray<z.ZodEnum<["venda", "locacao", "temporada"]>, "many">;
tipo: z.ZodString;
dormitorios: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
suites: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
banheiros: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
vagas_garagem: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
area_total: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
area_privativa: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
area_util: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
destaque: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
valor_venda: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
valor_locacao: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
valor_condominio: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
valor_iptu: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
endereco_cep: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_estado: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_cidade: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_bairro: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_logradouro: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_numero: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_complemento: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_referencia: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_zona: z.ZodOptional<z.ZodNullable<z.ZodString>>;
lat: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
lng: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
corretor_key: z.ZodOptional<z.ZodNullable<z.ZodString>>;
corretor_nome: z.ZodOptional<z.ZodNullable<z.ZodString>>;
condominio_key: z.ZodOptional<z.ZodNullable<z.ZodString>>;
condominio_nome: z.ZodOptional<z.ZodNullable<z.ZodString>>;
source_key: z.ZodString;
source_published_at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
source_updated_at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
sync_hash: z.ZodOptional<z.ZodNullable<z.ZodString>>;
}, "main_image" | "images" | "videos" | "virtual_tours"> & {
tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
numero_pessoas: z.ZodOptional<z.ZodNumber>;
valor_diaria: z.ZodOptional<z.ZodNumber>;
geo_aproximado: z.ZodOptional<z.ZodObject<{
lat: z.ZodNumber;
lng: z.ZodNumber;
}, "strip", z.ZodTypeAny, {
lat: number;
lng: number;
}, {
lat: number;
lng: number;
}>>;
id_imovel: z.ZodOptional<z.ZodString>;
finalidade: z.ZodOptional<z.ZodString>;
mobiliado: z.ZodOptional<z.ZodBoolean>;
caracteristicas: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
plantas: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
valor_seguro_incendio: z.ZodOptional<z.ZodNumber>;
valor_taxa_limpeza: z.ZodOptional<z.ZodNumber>;
andar: z.ZodOptional<z.ZodNumber>;
financiavel: z.ZodOptional<z.ZodBoolean>;
exclusividade: z.ZodOptional<z.ZodBoolean>;
permuta: z.ZodOptional<z.ZodBoolean>;
seguro_fianca: z.ZodOptional<z.ZodBoolean>;
situacao: z.ZodOptional<z.ZodString>;
status: z.ZodOptional<z.ZodString>;
distancia_mar: z.ZodOptional<z.ZodNumber>;
posicao: z.ZodOptional<z.ZodString>;
posicao_solar: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
calendario_temporada: z.ZodOptional<z.ZodAny>;
condominio_comodidades: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
condominio_tipo: z.ZodOptional<z.ZodString>;
subcondominio_id: z.ZodOptional<z.ZodString>;
condominio_fechado: z.ZodOptional<z.ZodBoolean>;
entrega_ano: z.ZodOptional<z.ZodNumber>;
entrega_mes: z.ZodOptional<z.ZodNumber>;
tipo_construcao: z.ZodOptional<z.ZodString>;
tipo_piso: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
periodicidade_iptu: z.ZodOptional<z.ZodString>;
terreno_frente: z.ZodOptional<z.ZodNumber>;
terreno_fundos: z.ZodOptional<z.ZodNumber>;
terreno_esquerdo: z.ZodOptional<z.ZodNumber>;
terreno_direita: z.ZodOptional<z.ZodNumber>;
terreno_total: z.ZodOptional<z.ZodNumber>;
rural_area_aravel: z.ZodOptional<z.ZodNumber>;
rural_sedes: z.ZodOptional<z.ZodNumber>;
rural_atividade: z.ZodOptional<z.ZodString>;
}, z.ZodTypeAny, "passthrough">, z.objectOutputType<Omit<{
currency: z.ZodDefault<z.ZodString>;
unit_area: z.ZodDefault<z.ZodString>;
unit_distance: z.ZodDefault<z.ZodEnum<["meters", "km"]>>;
reference: z.ZodString;
title: z.ZodString;
description: z.ZodString;
seo_slug: z.ZodOptional<z.ZodNullable<z.ZodString>>;
seo_title: z.ZodOptional<z.ZodNullable<z.ZodString>>;
seo_description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
seo_keywords: z.ZodOptional<z.ZodNullable<z.ZodString>>;
main_image: z.ZodOptional<z.ZodObject<{
md: z.ZodString;
sm: z.ZodString;
full: z.ZodString;
}, "strip", z.ZodTypeAny, {
md: string;
sm: string;
full: string;
}, {
md: string;
sm: string;
full: string;
}>>;
images: z.ZodArray<z.ZodObject<{
md: z.ZodString;
sm: z.ZodString;
full: z.ZodString;
cover: z.ZodBoolean;
}, "strip", z.ZodTypeAny, {
md: string;
sm: string;
full: string;
cover: boolean;
}, {
md: string;
sm: string;
full: string;
cover: boolean;
}>, "many">;
videos: z.ZodArray<z.ZodObject<{
url: z.ZodOptional<z.ZodNullable<z.ZodString>>;
}, "strip", z.ZodTypeAny, {
url?: string | null | undefined;
}, {
url?: string | null | undefined;
}>, "many">;
virtual_tours: z.ZodArray<z.ZodObject<{
embed_url: z.ZodString;
}, "strip", z.ZodTypeAny, {
embed_url: string;
}, {
embed_url: string;
}>, "many">;
operacao: z.ZodArray<z.ZodEnum<["venda", "locacao", "temporada"]>, "many">;
tipo: z.ZodString;
dormitorios: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
suites: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
banheiros: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
vagas_garagem: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
area_total: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
area_privativa: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
area_util: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
destaque: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
valor_venda: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
valor_locacao: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
valor_condominio: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
valor_iptu: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
endereco_cep: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_estado: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_cidade: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_bairro: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_logradouro: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_numero: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_complemento: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_referencia: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_zona: z.ZodOptional<z.ZodNullable<z.ZodString>>;
lat: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
lng: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
corretor_key: z.ZodOptional<z.ZodNullable<z.ZodString>>;
corretor_nome: z.ZodOptional<z.ZodNullable<z.ZodString>>;
condominio_key: z.ZodOptional<z.ZodNullable<z.ZodString>>;
condominio_nome: z.ZodOptional<z.ZodNullable<z.ZodString>>;
source_key: z.ZodString;
source_published_at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
source_updated_at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
sync_hash: z.ZodOptional<z.ZodNullable<z.ZodString>>;
}, "main_image" | "images" | "videos" | "virtual_tours"> & {
tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
numero_pessoas: z.ZodOptional<z.ZodNumber>;
valor_diaria: z.ZodOptional<z.ZodNumber>;
geo_aproximado: z.ZodOptional<z.ZodObject<{
lat: z.ZodNumber;
lng: z.ZodNumber;
}, "strip", z.ZodTypeAny, {
lat: number;
lng: number;
}, {
lat: number;
lng: number;
}>>;
id_imovel: z.ZodOptional<z.ZodString>;
finalidade: z.ZodOptional<z.ZodString>;
mobiliado: z.ZodOptional<z.ZodBoolean>;
caracteristicas: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
plantas: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
valor_seguro_incendio: z.ZodOptional<z.ZodNumber>;
valor_taxa_limpeza: z.ZodOptional<z.ZodNumber>;
andar: z.ZodOptional<z.ZodNumber>;
financiavel: z.ZodOptional<z.ZodBoolean>;
exclusividade: z.ZodOptional<z.ZodBoolean>;
permuta: z.ZodOptional<z.ZodBoolean>;
seguro_fianca: z.ZodOptional<z.ZodBoolean>;
situacao: z.ZodOptional<z.ZodString>;
status: z.ZodOptional<z.ZodString>;
distancia_mar: z.ZodOptional<z.ZodNumber>;
posicao: z.ZodOptional<z.ZodString>;
posicao_solar: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
calendario_temporada: z.ZodOptional<z.ZodAny>;
condominio_comodidades: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
condominio_tipo: z.ZodOptional<z.ZodString>;
subcondominio_id: z.ZodOptional<z.ZodString>;
condominio_fechado: z.ZodOptional<z.ZodBoolean>;
entrega_ano: z.ZodOptional<z.ZodNumber>;
entrega_mes: z.ZodOptional<z.ZodNumber>;
tipo_construcao: z.ZodOptional<z.ZodString>;
tipo_piso: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
periodicidade_iptu: z.ZodOptional<z.ZodString>;
terreno_frente: z.ZodOptional<z.ZodNumber>;
terreno_fundos: z.ZodOptional<z.ZodNumber>;
terreno_esquerdo: z.ZodOptional<z.ZodNumber>;
terreno_direita: z.ZodOptional<z.ZodNumber>;
terreno_total: z.ZodOptional<z.ZodNumber>;
rural_area_aravel: z.ZodOptional<z.ZodNumber>;
rural_sedes: z.ZodOptional<z.ZodNumber>;
rural_atividade: z.ZodOptional<z.ZodString>;
}, z.ZodTypeAny, "passthrough">>;
interface JetimobPropertyStreamOptions {
/** URL base da API. Default: `https://api.jetimob.com`. */
readonly baseUrl?: string;
/** Timeout por request HTTP em ms. Default: `30_000`. */
readonly requestTimeoutMs?: number;
/** Tamanho de página pro endpoint /imoveis. Default: `200`. */
readonly pageSize?: number;
}
/**
* Stream de imóveis da Jetimob.
*
* Estende `HttpStream<T>` do `@horizon-js/integrations-core` — a API Jetimob v4
* pagina de verdade (`?page=&pageSize=`, resposta traz `totalPages`), então o
* loop de paginação automático do `HttpStream` se aplica.
*
* ## A API Jetimob — o que foi testado e confirmado
*
* - **`/imoveis`** — endpoint pesado: cada imóvel traz ~96 campos (~9.5KB).
* **Não tem** parâmetro de seleção de campos (`fields`/`campos`/etc — JET-005).
* - **`/imoveis-ativos`** — endpoint LEVE: devolve só os `id_imovel` ativos
* numa tacada (~0.3s, ~9KB pros 1000+ imóveis). `getListing()` usa este.
* - **`?start={unix}`** — filtra `/imoveis` por data de atualização server-side.
* `readRecords(INCREMENTAL)` usa este → traz só o delta, sem baixar tudo.
* - **`?id=` vs `?codigos=`** — `id` filtra por `id_imovel`; `codigos` filtra
* por `codigo` (são diferentes — JET-002). `fetchByRef` aceita ambos.
*
* ## Peculiaridades de implementação (ver `jetimobManifest.knownIssues`)
*
* - **Auth no PATH**: a `webserviceKey` vai embutida na URL
* (`/webservice/{key}/imoveis`), não em header nem query — por isso entra no
* `urlBase`, e não há `AuthStrategy` dedicada.
* - **Envelope `{ data }`** (JET-001): `parseResponse` extrai `body.data`.
* - **`readRecords` defensivo**: o `readRecords` default do `HttpStream` não
* trata erro de conversão — um record inválido derrubaria o batch. Aqui é
* sobrescrito pra pular records que falham validação Zod (loga warning),
* na filosofia Airbyte (bad record ≠ falha de sync).
* - **Retry** (JET-006): a API devolve 502 transiente; `retryOptions` re-tenta.
*/
declare class JetimobPropertyStream extends HttpStream<HorizonPropertySchemaByJetimobType> implements IncrementalStream<HorizonPropertySchemaByJetimobType> {
readonly name = "properties";
readonly supportedSyncModes: SyncMode[];
readonly cursorField = "source_updated_at";
readonly primaryKey: string[];
readonly requestTimeoutMs: number;
/**
* Retry com backoff exponencial pra erros transientes (5xx/429/timeout).
* A API Jetimob devolve 502 Bad Gateway esporádico (JET-006). `HttpStream.doRequest`
* aplica este policy automaticamente; `getListing`/`fetchByRef`/`probe` aplicam via `retry()`.
*/
readonly retryOptions: RetryOptions;
private readonly webserviceKey;
private readonly base;
private readonly pageSize;
constructor(credentials: JetimobCredentials, options?: JetimobPropertyStreamOptions);
/** A `webserviceKey` é a auth — vai no path da URL base. */
get urlBase(): string;
path(): string;
requestParams(context: {
state?: SyncState;
nextPageToken?: unknown;
}): Record<string, string>;
/** API v4 retorna `{ total, page, pageSize, totalPages, data: [...] }` (JET-001). */
parseResponse(body: unknown): unknown[];
/** Próxima página via metadados do envelope. `undefined` encerra o loop. */
nextPageToken(response: {
body: unknown;
headers: Record<string, string>;
status: number;
}): unknown;
convertRecord(raw: unknown): HorizonPropertySchemaByJetimobType;
getJsonSchema(): Record<string, unknown>;
/** Mapeia status HTTP da Jetimob pros FailureType corretos. */
protected onHttpError(response: Response): Promise<Error>;
/**
* Itera os imóveis **crus** (sem conversão) página por página, seguindo a
* paginação automática do `HttpStream`. Base de `readRecords` e `fetchRaw`.
*
* Quando `state` é passado (INCREMENTAL), `requestParams` injeta `?start={unix}`
* e a própria API devolve só o delta — a paginação fica curta.
*/
private iterateRaw;
/**
* Retorna todos os imóveis **crus** (array, sem conversão). Útil pra
* profiling, debug, ou pra consumers que querem converter em lote com
* `parseResponseDefensive` do core. Espelha `Si9PropertyStream.fetchRaw()`.
*/
fetchRaw(): Promise<unknown[]>;
readRecords(syncMode: SyncMode, state?: SyncState): AsyncGenerator<HorizonPropertySchemaByJetimobType, void, undefined>;
/**
* Avança o cursor incremental a partir de um record lido.
* Cursor = maior `source_updated_at` visto.
*/
getUpdatedState(currentState: SyncState, record: HorizonPropertySchemaByJetimobType): SyncState;
/**
* Lista leve `[{ ref, updatedAt }]`. Usa o endpoint **`/imoveis-ativos`**, que
* devolve só os `id_imovel` ativos numa única resposta (~0.3s, ~9KB).
*
* Notas (JET-002):
* - `ref` = `id_imovel` (não o `codigo`). É o que `/imoveis-ativos` fornece e
* o que `?id=` consome. O converter expõe `id_imovel` como campo extra.
* - `updatedAt` é sempre `null` — `/imoveis-ativos` não traz timestamp. Pra
* delta com data, use `readRecords(INCREMENTAL)` (que filtra via `?start`).
*/
getListing(): Promise<ListingEntry$1[]>;
/**
* Busca UM imóvel pelo `ref`. A Jetimob não tem endpoint individual — usa o
* filtro no endpoint de lista. Tenta `?id={ref}` primeiro (pareia com o
* `id_imovel` que `getListing` devolve) e, se não achar, tenta `?codigos={ref}`.
* Retorna `null` se nenhum dos dois encontrar.
*/
fetchByRef(ref: string): Promise<HorizonPropertySchemaByJetimobType | null>;
/** Busca 1 imóvel por um filtro de query (`id=...` ou `codigos=...`). */
private fetchOne;
/**
* Valida a credencial fazendo o request mais barato possível
* (`/imoveis-ativos`, ~9KB). Lança `SyncError` se a `webserviceKey` for
* inválida. Usado por `JetimobSource.check()`.
*/
probe(): Promise<void>;
private buildHttpError;
}
/**
* Manifest declarativo do JetimobSource — cartão de identidade completo.
*
* Consumer/IA lê daqui pra entender 100% do adapter sem ler código:
* capabilities da API, issues conhecidos, streams oferecidos.
*
* @see {@link https://api.jetimob.com | API Jetimob}
*/
declare const jetimobManifest: SourceManifest<JetimobCredentials>;
/**
* Spec da configuração do JetimobSource — declara o shape das credenciais
* aceitas. JSON Schema draft-07, inspirado no `spec.json` do Airbyte.
*
* Usado pelo hub (UI de setup) e pela validação em runtime.
*/
declare const jetimobSpec: SourceSpec<JetimobCredentials>;
interface FetchConfig {
credentials: JetimobCredentials;
/** URL base da API. Default: `https://api.jetimob.com`. */
baseUrl?: string;
/** Tamanho de página. Default: `100`. */
pageSize?: number;
}
interface FetchAllResult {
properties: HorizonPropertySchemaByJetimobType[];
/** Imóveis que falharam validação Zod — não derrubam o batch. */
errors: string[];
}
interface ListingEntry {
ref: string;
/** Data de última atualização no CRM (ISO 8601), ou `null` se ausente. */
updatedAt: string | null;
}
/**
* Baixa todos os imóveis da conta Jetimob e converte pro formato Horizon.
* Imóveis que falharem validação Zod ficam em `errors` — não derrubam o batch.
*/
declare function fetchAll(config: FetchConfig): Promise<FetchAllResult>;
/**
* Retorna a lista leve `{ ref, updatedAt }[]` de todos os imóveis.
* Usado pelo orquestrador pra calcular delta sem baixar o payload completo.
*/
declare function getListing(config: FetchConfig): Promise<ListingEntry[]>;
/**
* Busca um imóvel específico pelo código (`ref`). Retorna `null` se não existir.
*/
declare function fetchByRef(config: FetchConfig, ref: string): Promise<HorizonPropertySchemaByJetimobType | null>;
interface PropertyDownloaderConfig {
credentials: JetimobCredentials;
baseUrl?: string;
pageSize?: number;
}
/**
* Cliente com config reusável entre chamadas. Wrapper fino sobre as funções
* `fetchAll` / `getListing` / `fetchByRef`.
*/
declare class PropertyDownloader {
private readonly config;
constructor(config: PropertyDownloaderConfig);
fetchAll(): Promise<FetchAllResult>;
getListing(): Promise<ListingEntry[]>;
fetchByRef(ref: string): Promise<HorizonPropertySchemaByJetimobType | null>;
}
declare const JetimobPropertySchemaSchema: z.ZodObject<{
codigo: z.ZodString;
titulo_anuncio: z.ZodOptional<z.ZodNullable<z.ZodString>>;
observacoes: z.ZodOptional<z.ZodNullable<z.ZodString>>;
descricao_anuncio: z.ZodOptional<z.ZodNullable<z.ZodString>>;
contrato: z.ZodOptional<z.ZodNullable<z.ZodString>>;
tipo: z.ZodOptional<z.ZodNullable<z.ZodString>>;
subtipo: z.ZodOptional<z.ZodNullable<z.ZodString>>;
status: z.ZodOptional<z.ZodNullable<z.ZodString>>;
situacao: z.ZodOptional<z.ZodNullable<z.ZodString>>;
destaque: z.ZodOptional<z.ZodNullable<z.ZodString>>;
destaque_fim: z.ZodOptional<z.ZodNullable<z.ZodString>>;
exclusividade: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodBoolean, z.ZodNumber]>>>;
financiavel: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodBoolean, z.ZodNumber]>>>;
permuta: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodBoolean, z.ZodNumber]>>>;
seguro_fianca: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodBoolean, z.ZodNumber]>>>;
mobiliado: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodBoolean, z.ZodNumber]>>>;
valor_venda: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
valor_venda_visivel: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodBoolean, z.ZodNumber]>>>;
valor_locacao: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
valor_locacao_visivel: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodBoolean, z.ZodNumber]>>>;
valor_temporada: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
valor_temporada_visivel: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodBoolean, z.ZodNumber]>>>;
valor_condominio: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
valor_condominio_visivel: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodBoolean, z.ZodNumber]>>>;
valor_iptu: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
valor_iptu_visivel: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodBoolean, z.ZodNumber]>>>;
valor_seguro_incendio: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
valor_taxa_limpeza: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
dormitorios: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
suites: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
banheiros: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
garagens: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
area_total: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
area_privativa: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
area_util: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
andar: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
andar_visivel: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodBoolean, z.ZodNumber]>>>;
endereco_cep: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_estado: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_estado_visivel: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodBoolean, z.ZodNumber]>>>;
endereco_cidade: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_cidade_visivel: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodBoolean, z.ZodNumber]>>>;
endereco_bairro: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_bairro_visivel: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodBoolean, z.ZodNumber]>>>;
endereco_zona: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_logradouro: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_logradouro_visivel: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodBoolean, z.ZodNumber]>>>;
endereco_numero: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodString, z.ZodNumber]>>>;
endereco_numero_visivel: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodBoolean, z.ZodNumber]>>>;
endereco_complemento: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_complemento_visivel: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodBoolean, z.ZodNumber]>>>;
endereco_referencia: z.ZodOptional<z.ZodNullable<z.ZodString>>;
endereco_referencia_visivel: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodBoolean, z.ZodNumber]>>>;
latitude: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodNumber, z.ZodString]>>>;
longitude: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodNumber, z.ZodString]>>>;
geoposicionamento_visivel: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
id_imovel: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
id_estado: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
id_cidade: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
id_bairro: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
id_condominio: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
id_subcondominio: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
id_corretor: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
distancia_mar: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
tipo_construcao: z.ZodOptional<z.ZodNullable<z.ZodString>>;
tipo_piso: z.ZodOptional<z.ZodNullable<z.ZodString>>;
entrega_ano: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodNumber, z.ZodString]>>>;
entrega_mes: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodNumber, z.ZodString]>>>;
posicao: z.ZodOptional<z.ZodNullable<z.ZodString>>;
posicao_solar: z.ZodOptional<z.ZodNullable<z.ZodString>>;
tags: z.ZodOptional<z.ZodNullable<z.ZodString>>;
terreno_frente: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodNumber, z.ZodString]>>>;
terreno_fundos: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodNumber, z.ZodString]>>>;
terreno_esquerdo: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodNumber, z.ZodString]>>>;
terreno_direita: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodNumber, z.ZodString]>>>;
terreno_total: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodNumber, z.ZodString]>>>;
medida_terreno_total: z.ZodOptional<z.ZodNullable<z.ZodString>>;
numero_pessoas: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
periodicidade_iptu: z.ZodOptional<z.ZodNullable<z.ZodString>>;
condominio_fechado: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodBoolean, z.ZodNumber]>>>;
condominio_nome: z.ZodOptional<z.ZodNullable<z.ZodString>>;
condominio_tipo: z.ZodOptional<z.ZodNullable<z.ZodString>>;
condominio_comodidades: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodString, "many">]>>>;
imovel_comodidades: z.ZodOptional<z.ZodNullable<z.ZodString>>;
rural: z.ZodOptional<z.ZodNullable<z.ZodObject<{
atividade_rural: z.ZodOptional<z.ZodNullable<z.ZodString>>;
rural_sedes: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodString, z.ZodNumber]>>>;
rural_area_aravel: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
medida_total_area_aravel: z.ZodOptional<z.ZodNullable<z.ZodString>>;
}, "strip", z.ZodTypeAny, {
rural_area_aravel?: number | null | undefined;
rural_sedes?: string | number | null | undefined;
atividade_rural?: string | null | undefined;
medida_total_area_aravel?: string | null | undefined;
}, {
rural_area_aravel?: number | null | undefined;
rural_sedes?: string | number | null | undefined;
atividade_rural?: string | null | undefined;
medida_total_area_aravel?: string | null | undefined;
}>>>;
calendario_temporada: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodAny, "many">]>>>;
meta_description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
imagens: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodObject<{
link: z.ZodString;
titulo: z.ZodOptional<z.ZodNullable<z.ZodString>>;
link_thumb: z.ZodOptional<z.ZodNullable<z.ZodString>>;
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
link: z.ZodString;
titulo: z.ZodOptional<z.ZodNullable<z.ZodString>>;
link_thumb: z.ZodOptional<z.ZodNullable<z.ZodString>>;
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
link: z.ZodString;
titulo: z.ZodOptional<z.ZodNullable<z.ZodString>>;
link_thumb: z.ZodOptional<z.ZodNullable<z.ZodString>>;
}, z.ZodTypeAny, "passthrough">>, "many">>>;
videos: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodAny, "many">>>;
plantas: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodAny, "many">>>;
tour360: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodAny, "many">>>;
medida: z.ZodOptional<z.ZodNullable<z.ZodString>>;
data_cadastro: z.ZodOptional<z.ZodNullable<z.ZodString>>;
data_update: z.ZodOptional<z.ZodNullable<z.ZodString>>;
data_atualizacao: z.ZodOptional<z.ZodNullable<z.ZodString>>;
updated_at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
codigo: z.ZodString;
titulo_anuncio: z.ZodOptional<z.ZodNullable<z.ZodString>>;
observacoes: z.ZodOptional<z.ZodNullable<z.ZodString>>;
descricao_anuncio: z.ZodOptional<z.ZodNullable<z.ZodString>>;
contrato: z.ZodOptional<z.ZodNullable<z.ZodString>>;
tipo: z.ZodOptional<z.ZodNullable<z.ZodString>>;
subtipo: z.ZodOptional<z.ZodNullable<z.ZodString>>;
status: z.ZodOptional<z.ZodNullable<z.ZodString>>;
situacao: z.ZodOptional<z.ZodNullable<z.ZodString>>;
destaque: z.ZodOptional<z.ZodNullable<z.ZodString>>;
destaque_fim: z.ZodOptional<z.ZodNullable<z.ZodString>>;
exclusividade: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodBoolean, z.ZodNumber]>>>;
financiavel: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodBoolean, z.ZodNumber]>>>;
permuta: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodBoolean, z.ZodNumber]>>>;
seguro_fianca: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodBoolean, z.ZodNumber]>>>;
mo