UNPKG

@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
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