UNPKG

@horizon-domains/property-model

Version:

Modelo de propriedades imobiliárias v3 - Sistema de atributos dinâmicos

1 lines 781 kB
{"version":3,"sources":["../src/schemas/horizon-property-schema-base.ts","../src/schemas/horizon-property-schema-base.zod.ts","../src/data/fake-properties/fake-apartamentos.json","../src/data/fake-properties/fake-casas-sobrados.json","../src/data/fake-properties/fake-comerciais.json","../src/data/fake-properties/fake-industriais.json","../src/data/fake-properties/fake-rurais.json","../src/data/fake-properties/fake-terrenos-lotes.json","../src/data/fake-properties/fake-all-properties.json","../src/utils/index.ts"],"sourcesContent":["import type { EntitySchema } from \"./types\";\n\nexport const horizonPropertySchemaBase: EntitySchema = {\n\tentity: \"property\",\n\tversion: \"2.3.0\",\n\tdescription: \"Schema base canônico do modelo de propriedade Horizon v3\",\n\tfields: [\n\t\t// ========================================\n\t\t// SISTEMA\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"source_published_at\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"sistema\"],\n\t\t\tformat: \"datetime\",\n\t\t\tui: {\n\t\t\t\tlabel: \"Data da publicação original\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"source_updated_at\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"sistema\"],\n\t\t\tformat: \"datetime\",\n\t\t\tvalidation: {\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tlabel: \"Data da última republicação\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"currency\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"sistema\"],\n\t\t\tvalidation: {\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tdb: {\n\t\t\t\tdefault: \"BRL\",\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tlabel: \"Moeda\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"unit_area\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"sistema\"],\n\t\t\tvalidation: {\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tdb: {\n\t\t\t\tdefault: \"m2\",\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tlabel: \"Unidade de área\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"unit_distance\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"sistema\"],\n\t\t\tenum: {\n\t\t\t\tmeters: \"Metros\",\n\t\t\t\tkm: \"Quilômetros\",\n\t\t\t},\n\t\t\tvalidation: {\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tdb: {\n\t\t\t\tdefault: \"meters\",\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tlabel: \"Unidade de distância\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\n\t\t// ========================================\n\t\t// CABEÇALHO\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"reference\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"cabecalho\"],\n\t\t\tvalidation: {\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tlabel: \"Referência\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"title\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"cabecalho\"],\n\t\t\tvalidation: {\n\t\t\t\trequired: true,\n\t\t\t\tmaxLength: 200,\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tlabel: \"Título\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"description\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"cabecalho\"],\n\t\t\tvalidation: {\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tdb: {\n\t\t\t\ttype: \"text\",\n\t\t\t\tindex: \"fulltext\",\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tlabel: \"Descrição\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t// ========================================\n\t\t// SEO\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"seo_slug\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"seo\"],\n\t\t\tvalidation: {\n\t\t\t\tmaxLength: 255,\n\t\t\t},\n\t\t\tdb: {\n\t\t\t\ttype: \"varchar(255)\",\n\t\t\t\tunique: true,\n\t\t\t\tindex: true,\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tlabel: \"Slug SEO\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"seo_title\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"seo\"],\n\t\t\tvalidation: {\n\t\t\t\tmaxLength: 60,\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tlabel: \"Título SEO\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"seo_description\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"seo\"],\n\t\t\tvalidation: {\n\t\t\t\tmaxLength: 160,\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tlabel: \"Descrição SEO\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"seo_keywords\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"seo\"],\n\t\t\tvalidation: {\n\t\t\t\tmaxLength: 200,\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tlabel: \"Palavras-chave SEO\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\n\t\t// ========================================\n\t\t// MÍDIAS\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"main_image\",\n\t\t\ttype: \"Json\",\n\t\t\tcategories: [\"media\"],\n\t\t\tui: {\n\t\t\t\tlabel: \"Imagem principal\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"images\",\n\t\t\ttype: \"Json[]\",\n\t\t\tcategories: [\"media\"],\n\t\t\tvalidation: {\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tlabel: \"Imagens\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"videos\",\n\t\t\ttype: \"Json[]\",\n\t\t\tcategories: [\"media\"],\n\t\t\tvalidation: {\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tlabel: \"Vídeos\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"virtual_tours\",\n\t\t\ttype: \"Json[]\",\n\t\t\tcategories: [\"media\"],\n\t\t\tvalidation: {\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tlabel: \"Tours virtuais\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\n\t\t// ========================================\n\t\t// FICHA TÉCNICA\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"operacao\",\n\t\t\ttype: \"String[]\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tenum: {\n\t\t\t\tvenda: \"Venda\",\n\t\t\t\tlocacao: \"Locação\",\n\t\t\t\ttemporada: \"Temporada\",\n\t\t\t},\n\t\t\tvalidation: {\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tlabel: \"Operação\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"tipo\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tvalidation: {\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tlabel: \"Tipo do imóvel\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"dormitorios\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tformat: \"count\",\n\t\t\tvalidation: {\n\t\t\t\tmin: 0,\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tlabel: \"Dormitórios\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"suites\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tformat: \"count\",\n\t\t\tvalidation: {\n\t\t\t\tmin: 0,\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tlabel: \"Suítes\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"banheiros\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tformat: \"count\",\n\t\t\tvalidation: {\n\t\t\t\tmin: 0,\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tlabel: \"Banheiros\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"vagas_garagem\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tformat: \"count\",\n\t\t\tvalidation: {\n\t\t\t\tmin: 0,\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tlabel: \"Vagas de garagem\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"area_total\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tformat: \"area\",\n\t\t\tunit: \"m2\",\n\t\t\tvalidation: {\n\t\t\t\tmin: 0,\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tlabel: \"Área total\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"area_privativa\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tformat: \"area\",\n\t\t\tunit: \"m2\",\n\t\t\tvalidation: {\n\t\t\t\tmin: 0,\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tlabel: \"Área privativa\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"area_util\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tformat: \"area\",\n\t\t\tunit: \"m2\",\n\t\t\tvalidation: {\n\t\t\t\tmin: 0,\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tlabel: \"Área útil\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"destaque\",\n\t\t\ttype: \"Boolean\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tui: {\n\t\t\t\tlabel: \"Imóvel em destaque\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t// ========================================\n\t\t// VALORES\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"valor_venda\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"valores\"],\n\t\t\tformat: \"currency\",\n\t\t\tunit: \"BRL\",\n\t\t\tvalidation: {\n\t\t\t\tprecision: 2,\n\t\t\t},\n\t\t\trules: {\n\t\t\t\tconditions: [\"operacao:venda\"],\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tlabel: \"Valor de venda\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"valor_locacao\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"valores\"],\n\t\t\tformat: \"currency\",\n\t\t\tunit: \"BRL\",\n\t\t\tvalidation: {\n\t\t\t\tprecision: 2,\n\t\t\t},\n\t\t\trules: {\n\t\t\t\tconditions: [\"operacao:locacao\"],\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tlabel: \"Valor de locação\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"valor_condominio\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"valores\"],\n\t\t\tformat: \"currency\",\n\t\t\tunit: \"BRL\",\n\t\t\tvalidation: {\n\t\t\t\tprecision: 2,\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tlabel: \"Valor do condomínio\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"valor_iptu\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"valores\"],\n\t\t\tformat: \"currency\",\n\t\t\tunit: \"BRL\",\n\t\t\tvalidation: {\n\t\t\t\tprecision: 2,\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tlabel: \"Valor do IPTU\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\n\t\t// ========================================\n\t\t// LOCALIZAÇÃO\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"endereco_cep\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"localizacao\"],\n\t\t\tvalidation: {\n\t\t\t\tmaxLength: 9,\n\t\t\t},\n\t\t\tmask: \"cep\",\n\t\t\tui: {\n\t\t\t\tlabel: \"CEP\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"endereco_estado\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"localizacao\"],\n\t\t\tui: {\n\t\t\t\tlabel: \"Estado\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"endereco_cidade\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"localizacao\"],\n\t\t\trules: {\n\t\t\t\tparent: \"endereco_estado\",\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tlabel: \"Cidade\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"endereco_bairro\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"localizacao\"],\n\t\t\trules: {\n\t\t\t\tparent: \"endereco_cidade\",\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tlabel: \"Bairro\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"endereco_logradouro\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"localizacao\"],\n\t\t\tui: {\n\t\t\t\tlabel: \"Logradouro\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"endereco_numero\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"localizacao\"],\n\t\t\tui: {\n\t\t\t\tlabel: \"Número\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"endereco_complemento\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"localizacao\"],\n\t\t\tui: {\n\t\t\t\tlabel: \"Complemento\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"endereco_referencia\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"localizacao\"],\n\t\t\tui: {\n\t\t\t\tlabel: \"Referência\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"endereco_zona\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"localizacao\"],\n\t\t\tui: {\n\t\t\t\tlabel: \"Zona\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"lat\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"localizacao\"],\n\t\t\tvalidation: {\n\t\t\t\tmin: -90,\n\t\t\t\tmax: 90,\n\t\t\t\tprecision: 8,\n\t\t\t},\n\t\t\tdb: {\n\t\t\t\ttype: \"decimal(10,8)\",\n\t\t\t\tindex: \"geo\",\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tlabel: \"Latitude\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"lng\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"localizacao\"],\n\t\t\tvalidation: {\n\t\t\t\tmin: -180,\n\t\t\t\tmax: 180,\n\t\t\t\tprecision: 8,\n\t\t\t},\n\t\t\tdb: {\n\t\t\t\ttype: \"decimal(11,8)\",\n\t\t\t\tindex: \"geo\",\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tlabel: \"Longitude\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t// ========================================\n\t\t// Relações\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"corretor_key\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"relations\"],\n\t\t\tui: {\n\t\t\t\tlabel: \"ID do corretor\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"corretor_nome\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"relations\"],\n\t\t\tui: {\n\t\t\t\tlabel: \"Nome do corretor\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"condominio_key\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"relations\"],\n\t\t\tui: {\n\t\t\t\tlabel: \"ID do condomínio\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"condominio_nome\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"relations\"],\n\t\t\tui: {\n\t\t\t\tlabel: \"Nome do condomínio\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"hb:property\",\n\t\t\t},\n\t\t},\n\t],\n};\n\nexport default horizonPropertySchemaBase;\n","import { z } from \"zod\"\n\n// Schema Horizon v2.3.0 para HorizonPropertySchemaBase\n// Removidos do base: tags, numero_pessoas, subtipo, valor_diaria, geo_aproximado (agora são extras de cada CRM)\n// Gerado automaticamente com inferência inteligente\n\n/**\n * Formato de imagem Horizon V3\n * - md: URL tamanho médio\n * - sm: URL tamanho pequeno\n * - full: URL tamanho completo\n */\nconst ImageSchema = z.object({\n md: z.string().url().describe(\"URL tamanho médio\"),\n sm: z.string().url().describe(\"URL tamanho pequeno\"),\n full: z.string().url().describe(\"URL tamanho completo\"),\n cover: z.boolean().describe(\"Se é imagem de capa\")\n})\n\n/**\n * Formato de imagem principal (sem flag cover)\n */\nconst MainImageSchema = z.object({\n md: z.string().url().describe(\"URL tamanho médio\"),\n sm: z.string().url().describe(\"URL tamanho pequeno\"),\n full: z.string().url().describe(\"URL tamanho completo\")\n})\n\nconst VideoSchema = z.object({\n url: z.string().nullish().describe(\"Url do vídeo\"),\n embed_url: z.string().nullish().describe(\"Url de incorporação do vídeo\"),\n})\n\nconst VirtualTourSchema = z.object({\n embed_url: z.string().url().describe(\"URL de incorporação do tour 360°\")\n})\n\nexport const HorizonPropertySchemaBaseZod = z.object({\n // Sistema\n source_published_at: z.string().nullish().describe(\"Data da publicação original\"),\n source_updated_at: z.string().describe(\"Data da última republicação\"),\n currency: z.string().default(\"BRL\").describe(\"Moeda\"),\n unit_area: z.string().default(\"m2\").describe(\"Unidade de área\"),\n unit_distance: z.enum([\"meters\", \"km\"]).default(\"meters\").describe(\"Unidade de distância\"),\n // Cabecalho\n reference: z.string().describe(\"Referência\"),\n title: z.string().max(200).describe(\"Título\"),\n description: z.string().describe(\"Descrição\"),\n // SEO\n seo_slug: z.string().max(255).nullish().describe(\"Slug SEO\"),\n seo_title: z.string().max(60).nullish().describe(\"Título SEO\"),\n seo_description: z.string().max(160).nullish().describe(\"Descrição SEO\"),\n seo_keywords: z.string().max(200).nullish().describe(\"Palavras-chave SEO\"),\n // Medias\n main_image: MainImageSchema.describe(\"Imagem principal\").optional(),\n images: z.array(ImageSchema).describe(\"Imagens\"),\n videos: z.array(VideoSchema).describe(\"Vídeos\"),\n virtual_tours: z.array(VirtualTourSchema).describe(\"Tours virtuais\"),\n // Ficha técnica\n operacao: z.array(z.enum([\"venda\", \"locacao\", \"temporada\"])).describe(\"Operação\"),\n tipo: z.string().describe(\"Tipo do imóvel\"),\n dormitorios: z.number().min(0).nullish().describe(\"Dormitórios\"),\n suites: z.number().min(0).nullish().describe(\"Suítes\"),\n banheiros: z.number().min(0).nullish().describe(\"Banheiros\"),\n vagas_garagem: z.number().min(0).nullish().describe(\"Vagas de garagem\"),\n area_total: z.number().min(0).nullish().describe(\"Área total\"),\n area_privativa: z.number().min(0).nullish().describe(\"Área privativa\"),\n area_util: z.number().min(0).nullish().describe(\"Área útil\"),\n destaque: z.boolean().nullish().describe(\"Imóvel em destaque\"),\n // VALORES\n valor_venda: z.number().nullish().describe(\"Valor de venda\"),\n valor_locacao: z.number().nullish().describe(\"Valor de locação\"),\n valor_condominio: z.number().nullish().describe(\"Valor do condomínio\"),\n valor_iptu: z.number().nullish().describe(\"Valor do IPTU\"),\n // LOCALIZACAO\n endereco_cep: z.string().max(9).nullish().describe(\"CEP\"),\n endereco_estado: z.string().nullish().describe(\"Estado\"),\n endereco_cidade: z.string().nullish().describe(\"Cidade\"),\n endereco_bairro: z.string().nullish().describe(\"Bairro\"),\n endereco_logradouro: z.string().nullish().describe(\"Logradouro\"),\n endereco_numero: z.string().nullish().describe(\"Número\"),\n endereco_complemento: z.string().nullish().describe(\"Complemento\"),\n endereco_referencia: z.string().nullish().describe(\"Referência\"),\n endereco_zona: z.string().nullish().describe(\"Zona\"),\n lat: z.number().min(-90).max(90).nullish().describe(\"Latitude\"),\n lng: z.number().min(-180).max(180).nullish().describe(\"Longitude\"),\n // RELACIONAMENTOS\n corretor_key: z.string().nullish().describe(\"ID do corretor\"),\n corretor_nome: z.string().nullish().describe(\"Nome do corretor\"),\n condominio_key: z.string().nullish().describe(\"ID do condomínio\"),\n condominio_nome: z.string().nullish().describe(\"Nome do condomínio\"),\n})\n\n// Tipo inferido a partir do schema\nexport type HorizonPropertySchemaBaseType = z.infer<typeof HorizonPropertySchemaBaseZod>\n// \n// Função helper para validação\nexport const validateHorizonPropertySchemaBase = (data: unknown): HorizonPropertySchemaBaseType => {\n return HorizonPropertySchemaBaseZod.parse(data)\n}\n\n// Função helper para validação safe\nexport const safeValidateHorizonPropertySchemaBase = (data: unknown) => {\n return HorizonPropertySchemaBaseZod.safeParse(data)\n}\n\n// Função helper para validação parcial\nexport const validatePartialHorizonPropertySchemaBase = (data: unknown) => {\n return HorizonPropertySchemaBaseZod.partial().parse(data)\n}\n","[\n {\n \"reference\": \"FAKE_0004\",\n \"updated_at\": \"2025-08-12T13:21:43.745Z\",\n \"title\": \"Excelente Imóvel - 2 quartos, 120m²\",\n \"description\": \"Excelente imóvel localizado em excelente bairro, cidade. Imóvel com ótima localização e acabamento de qualidade. Características destacadas incluem Alarme, Casa de Caseiro, Gesso. Agende sua visita!\",\n \"seo_slug\": \"cobertura-venda-alto-de-pinheiros\",\n \"seo_title\": \"Imóvel em São Paulo - Centro\",\n \"seo_description\": \"Imóvel com 2 dormitórios, 120m²\",\n \"seo_keywords\": \"venda, aluguel, imóvel\",\n \"main_image\": {\n \"full\": \"https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=480\"\n },\n \"images\": [\n {\n \"full\": \"https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=480\",\n \"cover\": true\n },\n {\n \"full\": \"https://images.unsplash.com/photo-1484154218962-a197022b5858?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1484154218962-a197022b5858?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1484154218962-a197022b5858?w=480\",\n \"cover\": false\n }\n ],\n \"videos\": [],\n \"virtual_tours\": [],\n \"documents\": [],\n \"currency\": \"BRL\",\n \"unit_area\": \"m2\",\n \"unit_distance\": \"meters\",\n \"map_show_proximity\": false,\n \"operacao\": [\n \"venda\",\n \"locacao\"\n ],\n \"valor_venda\": 271159.04,\n \"valor_locacao\": 4428.57,\n \"valor_diaria\": 218.09,\n \"valor_condominio\": 290.92,\n \"valor_iptu\": 5285.19,\n \"area_total\": 175,\n \"area_privativa\": 155,\n \"area_util\": 96,\n \"dormitorios\": 5,\n \"suites\": 0,\n \"banheiros\": 3,\n \"vagas_garagem\": 3,\n \"finalidade\": \"Mista\",\n \"tipo\": \"Apartamentos\",\n \"subtipo\": \"Cobertura\",\n \"endereco_cep\": \"63527-209\",\n \"endereco_estado\": \"Rio Grande do Sul\",\n \"endereco_cidade\": \"Novo Hamburgo\",\n \"endereco_bairro\": \"Alto de Pinheiros\",\n \"endereco_logradouro\": \"Rua XV de Novembro\",\n \"endereco_numero\": \"6499\",\n \"endereco_zona\": \"Oeste\",\n \"latitude\": -23.51776708,\n \"longitude\": -46.66023804,\n \"mobiliado\": false,\n \"caracteristicas\": [\n \"Aquecimento Central\",\n \"Box Blindex\",\n \"Cozinha Planejada\",\n \"Sanca\",\n \"Edícula\",\n \"Molduras\"\n ],\n \"destaque\": false,\n \"corretor_nome\": \"Roberto Lima\",\n \"tags\": [\n \"Cobertura\",\n \"Alto de pinheiros\",\n \"Imóvel\"\n ],\n \"numero_pessoas\": 7\n },\n {\n \"reference\": \"FAKE_0011\",\n \"updated_at\": \"2025-08-12T13:21:43.748Z\",\n \"title\": \"Imóvel de 120m² em excelente localização\",\n \"description\": \"Oportunidade única! Imóvel com excelente localização em cidade. Imóvel pronto para morar com todas as comodidades necessárias.\",\n \"seo_slug\": \"duplex-venda-ribeir-o-da-ilha\",\n \"seo_title\": \"Imóvel em São Paulo - Centro\",\n \"seo_description\": \"Imóvel com 2 dormitórios, 120m²\",\n \"seo_keywords\": \"venda, aluguel, imóvel\",\n \"main_image\": {\n \"full\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=480\"\n },\n \"images\": [\n {\n \"full\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=480\",\n \"cover\": true\n },\n {\n \"full\": \"https://images.unsplash.com/photo-1502672260266-1c1ef2d93688?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1502672260266-1c1ef2d93688?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1502672260266-1c1ef2d93688?w=480\",\n \"cover\": false\n },\n {\n \"full\": \"https://images.unsplash.com/photo-1484154218962-a197022b5858?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1484154218962-a197022b5858?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1484154218962-a197022b5858?w=480\",\n \"cover\": false\n }\n ],\n \"videos\": [],\n \"virtual_tours\": [],\n \"documents\": [],\n \"currency\": \"BRL\",\n \"unit_area\": \"m2\",\n \"unit_distance\": \"meters\",\n \"map_show_proximity\": false,\n \"operacao\": [\n \"venda\"\n ],\n \"valor_venda\": 3856364.73,\n \"valor_locacao\": 12967.22,\n \"valor_diaria\": 334.41,\n \"valor_condominio\": 1442.83,\n \"valor_iptu\": 2204.47,\n \"area_total\": 265,\n \"area_privativa\": 60,\n \"area_util\": 161,\n \"dormitorios\": 4,\n \"suites\": 1,\n \"banheiros\": 4,\n \"vagas_garagem\": 0,\n \"finalidade\": \"Comercial\",\n \"tipo\": \"Apartamentos\",\n \"subtipo\": \"Duplex\",\n \"endereco_cep\": \"78347-855\",\n \"endereco_estado\": \"Santa Catarina\",\n \"endereco_cidade\": \"Florianópolis\",\n \"endereco_bairro\": \"Ribeirão da Ilha\",\n \"endereco_logradouro\": \"Rua do Comércio\",\n \"endereco_numero\": \"9331\",\n \"endereco_zona\": \"Centro\",\n \"latitude\": -23.53861084,\n \"longitude\": -46.62940141,\n \"mobiliado\": true,\n \"caracteristicas\": [\n \"Área Gourmet\",\n \"Coworking\",\n \"Recepção\"\n ],\n \"destaque\": false,\n \"corretor_nome\": \"Maria Oliveira\",\n \"tags\": [\n \"Duplex\",\n \"Ribeirão da ilha\",\n \"Mobiliado\",\n \"Imóvel\"\n ],\n \"numero_pessoas\": 5\n },\n {\n \"reference\": \"FAKE_0014\",\n \"updated_at\": \"2025-08-12T13:21:43.748Z\",\n \"title\": \"Imóvel premium com ótima localização\",\n \"description\": \"Excelente imóvel localizado em excelente bairro, cidade. Imóvel com ótima localização e acabamento de qualidade. Características destacadas incluem Churrasqueira, Mármore. Agende sua visita!\",\n \"seo_slug\": \"studio-locacao-canasvieiras\",\n \"seo_title\": \"Imóvel em São Paulo - Centro\",\n \"seo_description\": \"Imóvel com 2 dormitórios, 120m²\",\n \"seo_keywords\": \"venda, aluguel, imóvel\",\n \"main_image\": {\n \"full\": \"https://images.unsplash.com/photo-1502672260266-1c1ef2d93688?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1502672260266-1c1ef2d93688?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1502672260266-1c1ef2d93688?w=480\"\n },\n \"images\": [\n {\n \"full\": \"https://images.unsplash.com/photo-1502672260266-1c1ef2d93688?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1502672260266-1c1ef2d93688?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1502672260266-1c1ef2d93688?w=480\",\n \"cover\": true\n },\n {\n \"full\": \"https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=480\",\n \"cover\": false\n },\n {\n \"full\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=480\",\n \"cover\": false\n },\n {\n \"full\": \"https://images.unsplash.com/photo-1484154218962-a197022b5858?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1484154218962-a197022b5858?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1484154218962-a197022b5858?w=480\",\n \"cover\": false\n }\n ],\n \"videos\": [],\n \"virtual_tours\": [],\n \"documents\": [],\n \"currency\": \"BRL\",\n \"unit_area\": \"m2\",\n \"unit_distance\": \"meters\",\n \"map_show_proximity\": false,\n \"operacao\": [\n \"locacao\",\n \"temporada\"\n ],\n \"valor_venda\": 1280908.15,\n \"valor_locacao\": 5250.71,\n \"valor_diaria\": 672.82,\n \"valor_condominio\": 1328.9,\n \"valor_iptu\": 5838.64,\n \"area_total\": 413,\n \"area_privativa\": 420,\n \"area_util\": 128,\n \"dormitorios\": 2,\n \"suites\": 0,\n \"banheiros\": 4,\n \"vagas_garagem\": 3,\n \"finalidade\": \"Rural\",\n \"tipo\": \"Apartamentos\",\n \"subtipo\": \"Studio\",\n \"endereco_cep\": \"90591-497\",\n \"endereco_estado\": \"Bahia\",\n \"endereco_cidade\": \"São Leopoldo\",\n \"endereco_bairro\": \"Canasvieiras\",\n \"endereco_logradouro\": \"Rua do Comércio\",\n \"endereco_numero\": \"899\",\n \"endereco_zona\": \"Centro-Sul\",\n \"latitude\": -23.57061612,\n \"longitude\": -46.66554703,\n \"mobiliado\": true,\n \"caracteristicas\": [\n \"Portão Eletrônico\",\n \"Sacada\",\n \"Granito\",\n \"Câmeras\",\n \"Gesso\",\n \"Churrasqueira\"\n ],\n \"destaque\": false,\n \"corretor_nome\": \"João Pereira\",\n \"condominio_nome\": \"Residencial Leblon Tower\",\n \"tags\": [\n \"Studio\",\n \"Canasvieiras\",\n \"Mobiliado\",\n \"Imóvel\"\n ],\n \"numero_pessoas\": 3\n },\n {\n \"reference\": \"FAKE_0015\",\n \"updated_at\": \"2025-08-12T13:21:43.748Z\",\n \"title\": \"Imóvel de 120m² em excelente localização\",\n \"description\": \"Imóvel moderno com excelente custo-benefício. Localizado em bairro nobre com fácil acesso a comércios e serviços. Acabamentos de primeira linha.\",\n \"seo_slug\": \"cobertura-venda-itaim-bibi\",\n \"seo_title\": \"Imóvel em São Paulo - Centro\",\n \"seo_description\": \"Imóvel com 2 dormitórios, 120m²\",\n \"seo_keywords\": \"venda, aluguel, imóvel\",\n \"main_image\": {\n \"full\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=480\"\n },\n \"images\": [\n {\n \"full\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=480\",\n \"cover\": true\n },\n {\n \"full\": \"https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=480\",\n \"cover\": false\n },\n {\n \"full\": \"https://images.unsplash.com/photo-1522708323590-d24dbb6b0267?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1522708323590-d24dbb6b0267?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1522708323590-d24dbb6b0267?w=480\",\n \"cover\": false\n },\n {\n \"full\": \"https://images.unsplash.com/photo-1484154218962-a197022b5858?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1484154218962-a197022b5858?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1484154218962-a197022b5858?w=480\",\n \"cover\": false\n },\n {\n \"full\": \"https://images.unsplash.com/photo-1502672260266-1c1ef2d93688?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1502672260266-1c1ef2d93688?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1502672260266-1c1ef2d93688?w=480\",\n \"cover\": false\n }\n ],\n \"videos\": [],\n \"virtual_tours\": [],\n \"documents\": [],\n \"currency\": \"BRL\",\n \"unit_area\": \"m2\",\n \"unit_distance\": \"meters\",\n \"map_show_proximity\": false,\n \"operacao\": [\n \"venda\"\n ],\n \"valor_venda\": 2258203.98,\n \"valor_locacao\": 4666.83,\n \"valor_diaria\": 403.5,\n \"valor_condominio\": 1004.08,\n \"valor_iptu\": 3830.35,\n \"area_total\": 57,\n \"area_privativa\": 154,\n \"area_util\": 240,\n \"dormitorios\": 4,\n \"suites\": 0,\n \"banheiros\": 2,\n \"vagas_garagem\": 4,\n \"finalidade\": \"Industrial\",\n \"tipo\": \"Apartamentos\",\n \"subtipo\": \"Cobertura\",\n \"endereco_cep\": \"41817-224\",\n \"endereco_estado\": \"Distrito Federal\",\n \"endereco_cidade\": \"Criciúma\",\n \"endereco_bairro\": \"Itaim Bibi\",\n \"endereco_logradouro\": \"Rua Tiradentes\",\n \"endereco_numero\": \"3817\",\n \"endereco_zona\": \"Sul\",\n \"latitude\": -23.57930697,\n \"longitude\": -46.62956582,\n \"mobiliado\": true,\n \"caracteristicas\": [\n \"Portão Eletrônico\",\n \"TV a Cabo\",\n \"Piso Laminado\",\n \"Poço Artesiano\",\n \"Elevador\",\n \"Lareira\"\n ],\n \"destaque\": false,\n \"corretor_nome\": \"Ana Silva\",\n \"condominio_nome\": \"Residencial Reserva das Águas\",\n \"tags\": [\n \"Cobertura\",\n \"Itaim bibi\",\n \"Mobiliado\",\n \"Imóvel\"\n ],\n \"numero_pessoas\": 2\n },\n {\n \"reference\": \"FAKE_0037\",\n \"updated_at\": \"2025-08-12T13:21:43.753Z\",\n \"title\": \"Excelente Imóvel - 2 quartos, 120m²\",\n \"description\": \"Imóvel moderno com excelente custo-benefício. Localizado em bairro nobre com fácil acesso a comércios e serviços. Acabamentos de primeira linha.\",\n \"seo_slug\": \"duplex-venda-belvedere\",\n \"seo_title\": \"Imóvel em São Paulo - Centro\",\n \"seo_description\": \"Imóvel com 2 dormitórios, 120m²\",\n \"seo_keywords\": \"venda, aluguel, imóvel\",\n \"main_image\": {\n \"full\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=480\"\n },\n \"images\": [\n {\n \"full\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=480\",\n \"cover\": true\n },\n {\n \"full\": \"https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=480\",\n \"cover\": false\n },\n {\n \"full\": \"https://images.unsplash.com/photo-1502672260266-1c1ef2d93688?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1502672260266-1c1ef2d93688?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1502672260266-1c1ef2d93688?w=480\",\n \"cover\": false\n }\n ],\n \"videos\": [],\n \"virtual_tours\": [],\n \"documents\": [],\n \"currency\": \"BRL\",\n \"unit_area\": \"m2\",\n \"unit_distance\": \"meters\",\n \"map_show_proximity\": false,\n \"operacao\": [\n \"venda\"\n ],\n \"valor_venda\": 560082.61,\n \"valor_locacao\": 2357.54,\n \"valor_diaria\": 303.72,\n \"valor_condominio\": 577.18,\n \"valor_iptu\": 1209.08,\n \"area_total\": 104,\n \"area_privativa\": 448,\n \"area_util\": 89,\n \"dormitorios\": 1,\n \"suites\": 0,\n \"banheiros\": 2,\n \"vagas_garagem\": 0,\n \"finalidade\": \"Residencial\",\n \"tipo\": \"Apartamentos\",\n \"subtipo\": \"Duplex\",\n \"endereco_cep\": \"28668-017\",\n \"endereco_estado\": \"Rio Grande do Sul\",\n \"endereco_cidade\": \"Uruguaiana\",\n \"endereco_bairro\": \"Belvedere\",\n \"endereco_logradouro\": \"Rua XV de Novembro\",\n \"endereco_numero\": \"7965\",\n \"endereco_zona\": \"Centro\",\n \"latitude\": -23.54076085,\n \"longitude\": -46.63466688,\n \"mobiliado\": true,\n \"caracteristicas\": [\n \"Piscina\",\n \"Churrasqueira\",\n \"Varanda\",\n \"Gesso\",\n \"Lavabo\"\n ],\n \"destaque\": false,\n \"corretor_nome\": \"Maria Oliveira\",\n \"tags\": [\n \"Duplex\",\n \"Belvedere\",\n \"Mobiliado\",\n \"Imóvel\"\n ],\n \"numero_pessoas\": 6\n },\n {\n \"reference\": \"FAKE_0040\",\n \"updated_at\": \"2025-08-12T13:21:43.753Z\",\n \"title\": \"Imóvel de 120m² em excelente localização\",\n \"description\": \"Excelente imóvel localizado em excelente bairro, cidade. Imóvel com ótima localização e acabamento de qualidade. Características destacadas incluem Piso Laminado, Cinema. Agende sua visita!\",\n \"seo_slug\": \"duplex-locacao-centro\",\n \"seo_title\": \"Imóvel em São Paulo - Centro\",\n \"seo_description\": \"Imóvel com 2 dormitórios, 120m²\",\n \"seo_keywords\": \"venda, aluguel, imóvel\",\n \"main_image\": {\n \"full\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=480\"\n },\n \"images\": [\n {\n \"full\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=480\",\n \"cover\": true\n },\n {\n \"full\": \"https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=480\",\n \"cover\": false\n },\n {\n \"full\": \"https://images.unsplash.com/photo-1502672260266-1c1ef2d93688?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1502672260266-1c1ef2d93688?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1502672260266-1c1ef2d93688?w=480\",\n \"cover\": false\n },\n {\n \"full\": \"https://images.unsplash.com/photo-1484154218962-a197022b5858?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1484154218962-a197022b5858?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1484154218962-a197022b5858?w=480\",\n \"cover\": false\n },\n {\n \"full\": \"https://images.unsplash.com/photo-1522708323590-d24dbb6b0267?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1522708323590-d24dbb6b0267?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1522708323590-d24dbb6b0267?w=480\",\n \"cover\": false\n }\n ],\n \"videos\": [],\n \"virtual_tours\": [],\n \"documents\": [],\n \"currency\": \"BRL\",\n \"unit_area\": \"m2\",\n \"unit_distance\": \"meters\",\n \"map_show_proximity\": false,\n \"operacao\": [\n \"locacao\"\n ],\n \"valor_venda\": 1862829.1,\n \"valor_locacao\": 1303.26,\n \"valor_diaria\": 384.73,\n \"valor_condominio\": 1519.78,\n \"valor_iptu\": 4334.83,\n \"area_total\": 496,\n \"area_privativa\": 397,\n \"area_util\": 47,\n \"dormitorios\": 5,\n \"suites\": 2,\n \"banheiros\": 2,\n \"vagas_garagem\": 0,\n \"finalidade\": \"Industrial\",\n \"tipo\": \"Apartamentos\",\n \"subtipo\": \"Duplex\",\n \"endereco_cep\": \"11577-206\",\n \"endereco_estado\": \"Bahia\",\n \"endereco_cidade\": \"Blumenau\",\n \"endereco_bairro\": \"Centro\",\n \"endereco_logradouro\": \"Rua Marechal Deodoro\",\n \"endereco_numero\": \"9433\",\n \"endereco_zona\": \"Leste\",\n \"latitude\": -23.51371631,\n \"longitude\": -46.58495402,\n \"mobiliado\": false,\n \"caracteristicas\": [\n \"Cinema\",\n \"Cozinha Planejada\",\n \"Playground\",\n \"Sacada\",\n \"Sauna\"\n ],\n \"destaque\": false,\n \"corretor_nome\": \"Patricia Souza\",\n \"tags\": [\n \"Duplex\",\n \"Centro\",\n \"Imóvel\"\n ],\n \"numero_pessoas\": 2\n },\n {\n \"reference\": \"FAKE_0041\",\n \"updated_at\": \"2025-08-12T13:21:43.753Z\",\n \"title\": \"Imóvel premium com ótima localização\",\n \"description\": \"Oportunidade única! Imóvel com excelente localização em cidade. Imóvel pronto para morar com todas as comodidades necessárias.\",\n \"seo_slug\": \"garden-locacao-mooca\",\n \"seo_title\": \"Imóvel em São Paulo - Centro\",\n \"seo_description\": \"Imóvel com 2 dormitórios, 120m²\",\n \"seo_keywords\": \"venda, aluguel, imóvel\",\n \"main_image\": {\n \"full\": \"https://images.unsplash.com/photo-1502672260266-1c1ef2d93688?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1502672260266-1c1ef2d93688?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1502672260266-1c1ef2d93688?w=480\"\n },\n \"images\": [\n {\n \"full\": \"https://images.unsplash.com/photo-1502672260266-1c1ef2d93688?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1502672260266-1c1ef2d93688?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1502672260266-1c1ef2d93688?w=480\",\n \"cover\": true\n },\n {\n \"full\": \"https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=480\",\n \"cover\": false\n },\n {\n \"full\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=480\",\n \"cover\": false\n },\n {\n \"full\": \"https://images.unsplash.com/photo-1484154218962-a197022b5858?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1484154218962-a197022b5858?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1484154218962-a197022b5858?w=480\",\n \"cover\": false\n },\n {\n \"full\": \"https://images.unsplash.com/photo-1522708323590-d24dbb6b0267?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1522708323590-d24dbb6b0267?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1522708323590-d24dbb6b0267?w=480\",\n \"cover\": false\n }\n ],\n \"videos\": [],\n \"virtual_tours\": [],\n \"documents\": [],\n \"currency\": \"BRL\",\n \"unit_area\": \"m2\",\n \"unit_distance\": \"meters\",\n \"map_show_proximity\": false,\n \"operacao\": [\n \"locacao\"\n ],\n \"valor_venda\": 3789545.96,\n \"valor_locacao\": 6550.17,\n \"valor_diaria\": 622.63,\n \"valor_condominio\": 1572.97,\n \"valor_iptu\": 5679.72,\n \"area_total\": 116,\n \"area_privativa\": 320,\n \"area_util\": 339,\n \"dormitorios\": 5,\n \"suites\": 0,\n \"banheiros\": 1,\n \"vagas_garagem\": 1,\n \"finalidade\": \"Mista\",\n \"tipo\": \"Apartamentos\",\n \"subtipo\": \"Garden\",\n \"endereco_cep\": \"91867-728\",\n \"endereco_estado\": \"Pernambuco\",\n \"endereco_cidade\": \"Nova Iguaçu\",\n \"endereco_bairro\": \"Mooca\",\n \"endereco_logradouro\": \"Avenida Central\",\n \"endereco_numero\": \"1485\",\n \"endereco_zona\": \"Leste\",\n \"latitude\": -23.57415356,\n \"longitude\": -46.67982593,\n \"mobiliado\": false,\n \"caracteristicas\": [\n \"Casa de Caseiro\",\n \"Quadra\",\n \"Elevador\",\n \"Recepção\"\n ],\n \"destaque\": false,\n \"corretor_nome\": \"Patricia Souza\",\n \"condominio_nome\": \"Condomínio Ingleses Beach\",\n \"tags\": [\n \"Garden\",\n \"Mooca\",\n \"Imóvel\"\n ],\n \"numero_pessoas\": 2\n },\n {\n \"reference\": \"FAKE_0048\",\n \"updated_at\": \"2025-08-12T13:21:43.755Z\",\n \"title\": \"Imóvel de 120m² em excelente localização\",\n \"description\": \"Imóvel moderno com excelente custo-benefício. Localizado em bairro nobre com fácil acesso a comércios e serviços. Acabamentos de primeira linha.\",\n \"seo_slug\": \"duplex-temporada-ipanema\",\n \"seo_title\": \"Imóvel em São Paulo - Centro\",\n \"seo_description\": \"Imóvel com 2 dormitórios, 120m²\",\n \"seo_keywords\": \"venda, aluguel, imóvel\",\n \"main_image\": {\n \"full\": \"https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=480\"\n },\n \"images\": [\n {\n \"full\": \"https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=480\",\n \"cover\": true\n },\n {\n \"full\": \"https://images.unsplash.com/photo-1522708323590-d24dbb6b0267?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1522708323590-d24dbb6b0267?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1522708323590-d24dbb6b0267?w=480\",\n \"cover\": false\n },\n {\n \"full\": \"https://images.unsplash.com/photo-1484154218962-a197022b5858?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1484154218962-a197022b5858?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1484154218962-a197022b5858?w=480\",\n \"cover\": false\n },\n {\n \"full\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=480\",\n \"cover\": false\n }\n ],\n \"videos\": [],\n \"virtual_tours\": [],\n \"documents\": [],\n \"currency\": \"BRL\",\n \"unit_area\": \"m2\",\n \"unit_distance\": \"meters\",\n \"map_show_proximity\": false,\n \"operacao\": [\n \"temporada\",\n \"locacao\"\n ],\n \"valor_venda\": 176161.52,\n \"valor_locacao\": 6089.75,\n \"valor_diaria\": 206.48,\n \"valor_condominio\": 219.67,\n \"valor_iptu\": 3070.3,\n \"area_total\": 32,\n \"area_privativa\": 127,\n \"area_util\": 398,\n \"dormitorios\": 2,\n \"suites\": 0,\n \"banheiros\": 2,\n \"vagas_garagem\": 4,\n \"finalidade\": \"Mista\",\n \"tipo\": \"Apartamentos\",\n \"subtipo\": \"Duplex\",\n \"endereco_cep\": \"92811-602\",\n \"endereco_estado\": \"Santa Catarina\",\n \"endereco_cidade\": \"Itajaí\",\n \"endereco_bairro\": \"Ipanema\",\n \"endereco_logradouro\": \"Avenida Central\",\n \"endereco_numero\": \"2171\",\n \"endereco_zona\": \"Centro\",\n \"latitude\": -23.54790079,\n \"longitude\": -46.66119864,\n \"mobiliado\": false,\n \"caracteristicas\": [\n \"Spa\",\n \"Jardim\",\n \"Churrasqueira\",\n \"Área Gourmet\",\n \"Portaria 24h\"\n ],\n \"destaque\": false,\n \"corretor_nome\": \"Patricia Souza\",\n \"condominio_nome\": \"Condomínio Botafogo Bay\",\n \"tags\": [\n \"Duplex\",\n \"Ipanema\",\n \"Imóvel\"\n ],\n \"numero_pessoas\": 7\n },\n {\n \"reference\": \"FAKE_0074\",\n \"updated_at\": \"2025-08-12T13:21:43.760Z\",\n \"title\": \"Imóvel com 2 dormitórios para venda\",\n \"description\": \"Excelente imóvel localizado em excelente bairro, cidade. Imóvel com ótima localização e acabamento de qualidade. Características destacadas incluem Casa de Caseiro, Ar Condicionado Central, Cisterna. Agende sua visita!\",\n \"seo_slug\": \"garden-locacao-copacabana\",\n \"seo_title\": \"Imóvel em São Paulo - Centro\",\n \"seo_description\": \"Imóvel com 2 dormitórios, 120m²\",\n \"seo_keywords\": \"venda, aluguel, imóvel\",\n \"main_image\": {\n \"full\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=480\"\n },\n \"images\": [\n {\n \"full\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=1024\",\n \"sm\": \"https://images.unsplash.com/photo-1571055107559-3e67626fa8be?w=480\",\n \"cover\": true\n },\n {\n \"full\": \"https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=1920\",\n \"md\": \"https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=1024\",\n \"sm\": \"https://images.unsplash.com/p