UNPKG

@horizon-modules/arbo-crm-integration

Version:

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

1,514 lines (1,503 loc) 183 kB
"use strict"; // src/converter/discoverers/discoverOperation.ts var operationLabels = { venda: "Venda", locacao: "Loca\xE7\xE3o", aluguel: "Loca\xE7\xE3o", temporada: "Temporada" }; function normalizeString(str) { return str.normalize("NFD").replace(/[\u0300-\u036f]/g, "").toLowerCase().trim(); } function discoverOperation(imovel) { if (!imovel.finalidade) return []; const normalized = normalizeString(imovel.finalidade); const operations = []; if (normalized.includes(" e ")) { const parts = normalized.split(" e "); parts.forEach((part) => { const label = operationLabels[part]; if (label) operations.push(label); }); } else { const label = operationLabels[normalized]; if (label) operations.push(label); } return operations; } // src/converter/discoverers/discoverAttributes.ts function discoverAttributes(imovel) { const attributes = {}; const operacao = discoverOperation(imovel); if (operacao.length > 0) attributes.operacao = operacao; if (imovel.valor_venda) attributes.valor_venda = imovel.valor_venda; if (imovel.valor_aluguel) attributes.valor_locacao = imovel.valor_aluguel; if (imovel.valor_condominio) attributes.valor_condominio = imovel.valor_condominio; if (imovel.valor_iptu) attributes.valor_iptu = imovel.valor_iptu; if (imovel.area_total) attributes.area_total = imovel.area_total; if (imovel.area_privativa) attributes.area_util = imovel.area_privativa; if (imovel.qtd_quartos) attributes.dormitorios = imovel.qtd_quartos; if (imovel.qtd_suites) attributes.suites = imovel.qtd_suites; if (imovel.qtd_banheiro) attributes.banheiros = imovel.qtd_banheiro; if (imovel.qtd_vagas) attributes.vagas_garagem = imovel.qtd_vagas; if (imovel.mobiliado) attributes.mobiliado = true; if (imovel.financiamento) attributes.financiavel = true; if (imovel.permuta) attributes.aceita_permuta = true; if (imovel.end_condominio) attributes.em_condominio = true; if (imovel.status_comercial) attributes.status_comercial = imovel.status_comercial; if (imovel.categoria) attributes.tipo = imovel.categoria; if (imovel.tipo_imovel) attributes.finalidade = imovel.tipo_imovel; if (imovel.categoria_imovel) attributes.padrao_imovel = imovel.categoria_imovel; if (imovel.end_cep) attributes.endereco_cep = imovel.end_cep; if (imovel.end_estado) attributes.endereco_estado = imovel.end_estado; if (imovel.end_cidade) attributes.endereco_cidade = imovel.end_cidade; if (imovel.end_bairro) attributes.endereco_bairro = imovel.end_bairro; if (imovel.end_logradouro) attributes.endereco_logradouro = imovel.end_logradouro; if (imovel.end_numero) attributes.endereco_numero = imovel.end_numero; if (imovel.end_complemento) attributes.endereco_complemento = imovel.end_complemento; if (imovel.end_condominio) attributes.condominio_nome = imovel.end_condominio; if (imovel.latitude) attributes.latitude = imovel.latitude; if (imovel.longitude) attributes.longitude = imovel.longitude; if (imovel?.corretor?.codigo) attributes.corretor_id = imovel.corretor.codigo; if (imovel?.corretor?.nome) attributes.corretor_nome = imovel.corretor.nome; if (imovel.caracteristicas) attributes.caracteristicas = imovel.caracteristicas; return attributes; } // src/converter/discoverers/discoverMedia.ts function discoverMedias(imovel) { const images = imovel.fotos?.slice().sort((a, b) => (a.ordem ?? 0) - (b.ordem ?? 0)).map((foto, index) => ({ full: foto.marcadagua_url || foto.url, md: foto.sizes?.medium, sm: foto.sizes?.small, cover: index === 0 || foto.principal === true })) ?? []; const videos = imovel.url_video ? [generateVideo(imovel.url_video)] : []; const virtual_tours = imovel.url_tour ? [{ embed_url: imovel.url_tour }] : []; const documents = []; const result = {}; if (images.length > 0) result.images = images; if (videos.length > 0) result.videos = videos; if (virtual_tours.length > 0) result.virtual_tours = virtual_tours; if (documents.length > 0) result.documents = documents; return result; } function generateVideo(url) { try { const parsed = new URL(url); const host = parsed.hostname; if (host.includes("youtube.com") || host.includes("youtu.be")) { const id = parsed.searchParams.get("v") || parsed.pathname.split("/").pop(); return { provider: "youtube", id: id || void 0, embed_url: `https://www.youtube.com/embed/${id}` }; } return { embed_url: url }; } catch (e) { return { embed_url: url }; } } // src/converter/discoverers/discoverConfigs.ts function discoverSettings(_imovel) { return { currency_unit: "BRL", area_unit: "m2", distance_unit: "meters", exibir_no_mapa: true }; } // src/converter/index.ts function convertArboToPropertyV3(imovel) { return { reference: imovel.codigo ?? "", title: imovel.titulo ?? "", description: imovel.descricao ?? "", media_assets: discoverMedias(imovel), attributes: discoverAttributes(imovel), settings: discoverSettings(imovel), updated_at: imovel.updated_at }; } // src/services/ArboApiClient.ts var ArboApiClient = class { constructor(config) { this.token = config.token; this.baseUrl = config.baseUrl || "https://app-integracao.arboimoveis.com/api"; } async request(endpoint) { const url = `${this.baseUrl}${endpoint}`; const response = await fetch(url, { headers: { Authorization: this.token, "Content-Type": "application/json" } }); if (!response.ok) { throw new Error( `Erro na requisi\xE7\xE3o: ${response.status} - ${response.statusText}` ); } return response.json(); } async getImoveis(page = 1, perPage = 50) { return this.request( `/imoveis?page=${page}&perPage=${perPage}&fields=%5B%5D&search=%7B%7D` ); } async getImovel(id) { return this.request(`/imoveis/${id}`); } async searchImoveis(searchParams, page = 1, perPage = 50) { const search = encodeURIComponent(JSON.stringify(searchParams)); return this.request( `/imoveis?page=${page}&perPage=${perPage}&search=${search}` ); } async getAllPages(perPage = 50) { const firstPage = await this.getImoveis(1, perPage); const totalPages = firstPage.meta?.last_page || 1; const allImoveis = [...firstPage.data]; for (let page = 2; page <= totalPages; page++) { const pageData = await this.getImoveis(page, perPage); allImoveis.push(...pageData.data); } return allImoveis; } }; // src/services/ArboDownloader.ts import { promises as fs } from "fs"; import { join } from "path"; var ArboDownloader = class { constructor(config) { this.apiClient = new ArboApiClient({ token: config.token, baseUrl: config.baseUrl || "https://app-integracao.arboimoveis.com/api" }); this.outputDir = config.outputDir; } async ensureOutputDir() { try { await fs.access(this.outputDir); } catch { await fs.mkdir(this.outputDir, { recursive: true }); } } async savePageData(page, data) { if (!data.data || !Array.isArray(data.data) || data.data.length === 0) { console.log(` \u{1F4C4} P\xE1gina ${page} vazia, n\xE3o salvando arquivo`); return false; } const fileName = `page-${page}.json`; const filePath = join(this.outputDir, fileName); await fs.writeFile(filePath, JSON.stringify(data, null, 2), "utf8"); return true; } async downloadPage(page, perPage = 50) { await this.ensureOutputDir(); const response = await this.apiClient.getImoveis(page, perPage); await this.savePageData(page, response); } async downloadPages(options = {}) { const { startPage = 1, endPage, maxPages, perPage = 50 } = options; await this.ensureOutputDir(); const errors = []; let totalPages = 0; let totalItems = 0; let downloadedItems = 0; try { const firstPage = await this.apiClient.getImoveis(1, perPage); totalPages = firstPage.meta?.last_page || 1; totalItems = firstPage.meta?.total || 0; const finalEndPage = endPage || (maxPages ? Math.min(startPage + maxPages - 1, totalPages) : totalPages); if (startPage === 1) { const saved = await this.savePageData(1, firstPage); if (saved) { downloadedItems += firstPage.data.length; } if (!firstPage.data || firstPage.data.length === 0) { console.log(`\u26A0\uFE0F Primeira p\xE1gina vazia, finalizando download`); return { totalPages: 1, totalItems: 0, downloadedItems: 0, errors }; } } for (let page = Math.max(startPage, 2); page <= finalEndPage; page++) { try { const response = await this.apiClient.getImoveis(page, perPage); if (!response.data || response.data.length === 0) { console.log(`\u26A0\uFE0F P\xE1gina ${page} vazia, finalizando download`); break; } const saved = await this.savePageData(page, response); if (saved) { downloadedItems += response.data.length; } } catch (error) { const errorMsg = `Erro ao baixar p\xE1gina ${page}: ${error instanceof Error ? error.message : String(error)}`; errors.push(errorMsg); console.error(errorMsg); } } } catch (error) { const errorMsg = `Erro geral no download: ${error instanceof Error ? error.message : String(error)}`; errors.push(errorMsg); console.error(errorMsg); } return { totalPages, totalItems, downloadedItems, errors }; } async downloadAll(perPage = 50) { return this.downloadPages({ perPage }); } async uploadToApi(uploadConfig) { const { endpoint, headers = {} } = uploadConfig; const errors = []; let totalProcessed = 0; let totalSent = 0; let totalErrors = 0; try { const files = await fs.readdir(this.outputDir); const jsonFiles = files.filter((file) => file.endsWith(".json")).sort((a, b) => { const numA = parseInt(a.match(/page-(\d+)/)?.[1] || "0"); const numB = parseInt(b.match(/page-(\d+)/)?.[1] || "0"); return numA - numB; }); console.log(`\u{1F4C1} Encontrados ${jsonFiles.length} arquivos para processar`); for (const file of jsonFiles) { console.log(` \u{1F4C4} Processando ${file}...`); try { const filePath = join(this.outputDir, file); const content = await fs.readFile(filePath, "utf8"); const pageData = JSON.parse(content); if (!pageData.data || !Array.isArray(pageData.data)) { errors.push(`Arquivo ${file} n\xE3o possui estrutura v\xE1lida`); console.log(" \u{1F4C4} Arquivo vazio, pulando..."); continue; } const properties = pageData.data; if (properties.length === 0) { console.log(" \u{1F4C4} Arquivo vazio, pulando..."); continue; } console.log(` \u{1F4CA} ${properties.length} im\xF3veis encontrados`); totalProcessed += properties.length; try { const response = await fetch(endpoint, { method: "PUT", headers: { "Content-Type": "application/json", ...headers }, // Envia dados originais da Arbo - API faz a conversão body: JSON.stringify({ properties }) }); if (response.ok) { const result = await response.json(); totalSent += properties.length; console.log(` \u2705 Sucesso: ${properties.length} im\xF3veis inseridos`); console.log(` \u{1F4DD} ${result.message || "Processado com sucesso"}`); } else { const errorText = await response.text(); totalErrors += properties.length; const errorMsg = `Erro ${response.status} ao enviar arquivo ${file}: ${errorText}`; errors.push(errorMsg); console.log(` \u274C ${errorMsg}`); break; } } catch (error) { totalErrors += properties.length; const errorMsg = `Erro de rede ao enviar arquivo ${file}: ${error instanceof Error ? error.message : String(error)}`; errors.push(errorMsg); console.error(` \u274C ${errorMsg}`); break; } await new Promise((resolve) => setTimeout(resolve, 500)); } catch (error) { const errorMsg = `Erro ao processar arquivo ${file}: ${error instanceof Error ? error.message : String(error)}`; errors.push(errorMsg); console.error(` \u274C ${errorMsg}`); } } } catch (error) { const errorMsg = `Erro ao acessar diret\xF3rio ${this.outputDir}: ${error instanceof Error ? error.message : String(error)}`; errors.push(errorMsg); console.error(`\u274C ${errorMsg}`); } console.log("\n\u{1F389} RESUMO FINAL:"); console.log(`\u{1F4CA} Total processado: ${totalProcessed} im\xF3veis`); console.log(`\u2705 Sucessos: ${totalSent} im\xF3veis`); console.log(`\u274C Erros: ${totalErrors} im\xF3veis`); if (totalProcessed > 0) { console.log(`\u{1F4C8} Taxa de sucesso: ${Math.round(totalSent / totalProcessed * 100)}%`); } return { totalProcessed, totalSent, totalErrors, errors }; } async downloadAndUpload(downloadOptions, uploadConfig) { const downloadResult = await this.downloadPages(downloadOptions); const uploadResult = await this.uploadToApi(uploadConfig); return { downloadResult, uploadResult }; } }; // src/services/ProfilerService.ts import * as fs2 from "fs"; import * as path from "path"; var ProfilerService = class { constructor(config) { this.fieldData = /* @__PURE__ */ new Map(); this.fieldExamples = /* @__PURE__ */ new Map(); this.config = { outputFileName: "profiling-report.json", defaultMaxExamples: 10, verbose: false, ...config }; } async profile() { if (this.config.verbose) { console.log("\u{1F4CA} Iniciando profiling dos dados..."); } if (!fs2.existsSync(this.config.inputDir)) { throw new Error(`Diret\xF3rio de entrada n\xE3o encontrado: ${this.config.inputDir}`); } const data = await this.loadData(); this.processData(data); const result = this.generateResult(); await this.saveResult(result); return result; } async loadData() { const files = fs2.readdirSync(this.config.inputDir).filter((file) => file.endsWith(".json")).sort(); if (this.config.verbose) { console.log(`\u{1F4C1} Carregando ${files.length} arquivos...`); } const allData = []; for (const file of files) { const filePath = path.join(this.config.inputDir, file); const content = fs2.readFileSync(filePath, "utf8"); const fileData = JSON.parse(content); if (fileData.data && Array.isArray(fileData.data)) { allData.push(...fileData.data); if (this.config.verbose) { console.log(` \u2705 ${file}: ${fileData.data.length} itens`); } } } if (this.config.verbose) { console.log(`\u{1F50D} Analisando ${allData.length} itens...`); } return allData; } processData(data) { data.forEach((item, index) => { if (this.config.verbose && (index + 1) % 100 === 0) { console.log(` Processando ${index + 1}/${data.length}...`); } this.processObject(item, ""); }); } processObject(obj, prefix) { for (const [key, value] of Object.entries(obj)) { const fieldName = prefix ? `${prefix}.${key}` : key; if (value === null || value === void 0) { continue; } if (Array.isArray(value)) { this.processArrayField(fieldName, value); } else if (typeof value === "object") { this.processObject(value, fieldName); } else { this.processSimpleField(fieldName, value); } } } processArrayField(fieldName, array) { for (const item of array) { if (item !== null && item !== void 0) { if (typeof item === "object") { this.processObject(item, fieldName); } else { this.processSimpleField(fieldName, item); } } } } processSimpleField(fieldName, value) { if (!this.fieldData.has(fieldName)) { this.fieldData.set(fieldName, /* @__PURE__ */ new Set()); this.fieldExamples.set(fieldName, []); } const valueSet = this.fieldData.get(fieldName); const examples = this.fieldExamples.get(fieldName); valueSet.add(value); const fieldConfig = this.config.fieldConfigs?.[fieldName] || {}; const maxExamples = fieldConfig.maxExamples ?? this.config.defaultMaxExamples; if (!examples.includes(value) && examples.length < maxExamples) { examples.push(value); } } generateResult() { const result = {}; const sortedFields = Array.from(this.fieldData.keys()).sort(); for (const fieldName of sortedFields) { const examples = this.fieldExamples.get(fieldName) || []; const sortedExamples = examples.sort((a, b) => { const aStr = String(a); const bStr = String(b); return aStr.localeCompare(bStr); }); result[fieldName] = sortedExamples; } return result; } async saveResult(result) { if (!fs2.existsSync(this.config.outputDir)) { fs2.mkdirSync(this.config.outputDir, { recursive: true }); } const outputPath = path.join(this.config.outputDir, this.config.outputFileName); const jsonContent = JSON.stringify(result, null, 2); fs2.writeFileSync(outputPath, jsonContent, "utf8"); if (this.config.verbose) { const sizeKB = (jsonContent.length / 1024).toFixed(1); console.log(`\u2705 Profiling salvo em: ${outputPath} (${sizeKB}KB)`); console.log(`\u{1F4CA} Total de campos analisados: ${Object.keys(result).length}`); } } }; // src/data/mock/validos.json var validos_default = [ { codigo: "MOCK_TEST-APARTAMENTO_001", titulo: "Apartamento Teste - Mock 1", descricao: "Mock de apartamento para testes gerado automaticamente para testes", categoria: "Apartamento", finalidade: "Venda", ativo: true, publicado: true, created_at: "2025-07-08T19:46:41.100Z", updated_at: "2025-07-08T19:46:41.100Z", qtd_quartos: 2, valor_venda: 25e4, area_privativa: 0, "corretor.codigo": 908381, end_logradouro: "Rua Mathias de Albuquerque", end_bairro: "Oficinas", end_cidade: "Ponta Grossa", end_estado: "PR", longitude: -50.1480833, fotos: [ { id: "MOCK_FOTO_MOCK_TEST-APARTAMENTO_001_1", url: "https://images.unsplash.com/photo-1522708323590-d24dbb6b0267?w=800&q=80", descricao: "Apartamento Teste - Vista principal", destaque: true, ordem: 1 }, { id: "MOCK_FOTO_MOCK_TEST-APARTAMENTO_001_2", url: "https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=800&q=80", descricao: "Vista externa", destaque: false, ordem: 2 } ], observacoes: "Observa\xE7\xF5es do Apartamento Teste: Documenta\xE7\xE3o em ordem" }, { codigo: "MOCK_TEST-CASA_001", titulo: "Casa Teste com 2 quartos, 120m\xB2", descricao: "Mock de casa para testes gerado automaticamente para testes", categoria: "Casa", finalidade: "Venda", ativo: true, publicado: true, created_at: "2025-07-08T19:46:41.100Z", updated_at: "2025-07-08T19:46:41.100Z", qtd_quartos: 2, qtd_banheiro: 3, area_construida: 120, area_terreno: 200, valor_venda: 35e4, area_total: 518, caracteristicas: "Sala", condominio: 237551, "corretor.codigo": 913153, end_logradouro: "Rua Tinguis", end_numero: 8, latitude: -25.1122291, fotos: [ { id: "MOCK_FOTO_MOCK_TEST-CASA_001_1", url: "https://images.unsplash.com/photo-1512917774080-9991f1c4c750?w=800&q=80", descricao: "Casa Teste - Vista principal", destaque: true, ordem: 1 }, { id: "MOCK_FOTO_MOCK_TEST-CASA_001_2", url: "https://images.unsplash.com/photo-1555041469-a586c61ea9bc?w=800&q=80", descricao: "Vista interior", destaque: false, ordem: 2 }, { id: "MOCK_FOTO_MOCK_TEST-CASA_001_3", url: "https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=800&q=80", descricao: "Vista interior", destaque: false, ordem: 3 }, { id: "MOCK_FOTO_MOCK_TEST-CASA_001_4", url: "https://images.unsplash.com/photo-1555041469-a586c61ea9bc?w=800&q=80", descricao: "Vista interior", destaque: false, ordem: 4 } ] }, { codigo: "MOCK_TEST-APARTAMENTO_002", titulo: "Apartamento Teste com 2 quartos, 45m\xB2", descricao: "Mock de apartamento para testes gerado automaticamente para testes", categoria: "Apartamento", finalidade: "Venda", ativo: true, publicado: true, created_at: "2025-07-08T19:46:41.101Z", updated_at: "2025-07-08T19:46:41.101Z", qtd_quartos: 2, qtd_banheiro: 2, area_construida: 45, valor_venda: 25e4, area_total: 270, end_bairro: "Jardins", end_cep: "84017316", longitude: -50.1217041015625, fotos: [ { id: "MOCK_FOTO_MOCK_TEST-APARTAMENTO_002_1", url: "https://images.unsplash.com/photo-1502672260266-1c1ef2d93688?w=800&q=80", descricao: "Apartamento Teste - Vista principal", destaque: true, ordem: 1 }, { id: "MOCK_FOTO_MOCK_TEST-APARTAMENTO_002_2", url: "https://images.unsplash.com/photo-1556909114-f6e7ad7d3136?w=800&q=80", descricao: "Vista interior", destaque: false, ordem: 2 }, { id: "MOCK_FOTO_MOCK_TEST-APARTAMENTO_002_3", url: "https://images.unsplash.com/photo-1555041469-a586c61ea9bc?w=800&q=80", descricao: "Vista interior", destaque: false, ordem: 3 }, { id: "MOCK_FOTO_MOCK_TEST-APARTAMENTO_002_4", url: "https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=800&q=80", descricao: "Vista interior", destaque: false, ordem: 4 } ], end_logradouro: "Rua Mock 438", end_numero: "637", end_cidade: "S\xE3o Paulo", end_estado: "RS" }, { codigo: "MOCK_TEST-CASA_002", titulo: "Casa Teste - Mock 2", descricao: "Mock de casa para testes gerado automaticamente para testes", categoria: "Casa", finalidade: "Venda", ativo: true, publicado: true, created_at: "2025-07-08T19:46:41.101Z", updated_at: "2025-07-08T19:46:41.101Z", qtd_banheiro: 3, area_construida: 120, valor_venda: 55e4, area_privativa: 98.25, area_total: 1, codigo_origem: "GD0002", condominio: 237885, "corretor.codigo": 908218, end_logradouro: "Rua Tinguis", end_numero: 8, end_cidade: "Ponta Grossa", end_estado: "PR", longitude: -50.1461068, fotos: [ { id: "MOCK_FOTO_MOCK_TEST-CASA_002_1", url: "https://images.unsplash.com/photo-1570129477492-45c003edd2be?w=800&q=80", descricao: "Casa Teste - Vista principal", destaque: true, ordem: 1 }, { id: "MOCK_FOTO_MOCK_TEST-CASA_002_2", url: "https://images.unsplash.com/photo-1570129477492-45c003edd2be?w=800&q=80", descricao: "Vista externa", destaque: false, ordem: 2 } ] }, { codigo: "MOCK_TEST-APARTAMENTO_003", titulo: "Apartamento Teste - Mock 3", descricao: "Mock de apartamento para testes gerado automaticamente para testes", categoria: "Apartamento", finalidade: "Venda", ativo: true, publicado: true, created_at: "2025-07-08T19:46:41.101Z", updated_at: "2025-07-08T19:46:41.101Z", qtd_quartos: 3, valor_venda: 25e4, area_total: 155, categoria_imovel: "Padr\xE3o", end_logradouro: "Rua Mathias de Albuquerque", end_bairro: "Oficinas", end_cidade: "Ponta Grossa", end_estado: "PR", end_cep: "84036140", latitude: -25.1187197, longitude: -50.1480833, fotos: [ { id: "MOCK_FOTO_MOCK_TEST-APARTAMENTO_003_1", url: "https://images.unsplash.com/photo-1565183997392-2f6f122e5912?w=800&q=80", descricao: "Apartamento Teste - Vista principal", destaque: true, ordem: 1 }, { id: "MOCK_FOTO_MOCK_TEST-APARTAMENTO_003_2", url: "https://images.unsplash.com/photo-1555041469-a586c61ea9bc?w=800&q=80", descricao: "Vista interior", destaque: false, ordem: 2 }, { id: "MOCK_FOTO_MOCK_TEST-APARTAMENTO_003_3", url: "https://images.unsplash.com/photo-1555041469-a586c61ea9bc?w=800&q=80", descricao: "Vista interior", destaque: false, ordem: 3 } ], qtd_suites: 1 }, { codigo: "MOCK_TEST-COMERCIAL_001", titulo: "Comercial Teste - Mock 1", descricao: "Mock de im\xF3vel comercial para testes gerado automaticamente para testes", categoria: "Comercial", finalidade: "Loca\xE7\xE3o", ativo: true, publicado: true, created_at: "2025-07-08T19:46:41.101Z", updated_at: "2025-07-08T19:46:41.101Z", area_construida: 30, valor_locacao: 3e3, area_privativa: 114, area_total: 100, caracteristicas: "Sala de estar", categoria_imovel: "Padr\xE3o", "corretor.codigo": 908392, end_logradouro: "Rua General C\xE2ndido Rondon", end_bairro: "Nova R\xFAssia", end_cidade: "Ponta Grossa", end_estado: "PR", end_cep: "84070-020", latitude: -14.235004, longitude: -51.92528, fotos: [ { id: "MOCK_FOTO_MOCK_TEST-COMERCIAL_001_1", url: "https://images.unsplash.com/photo-1497366811353-6870744d04b2?w=800&q=80", descricao: "Comercial Teste - Vista principal", destaque: true, ordem: 1 }, { id: "MOCK_FOTO_MOCK_TEST-COMERCIAL_001_2", url: "https://images.unsplash.com/photo-1555041469-a586c61ea9bc?w=800&q=80", descricao: "Vista interior", destaque: false, ordem: 2 } ], observacoes: "Observa\xE7\xF5es do Comercial Teste: Excelente localiza\xE7\xE3o" }, { codigo: "MOCK_TEST-APARTAMENTO_004", titulo: "Apartamento Teste com 3 quartos, 65m\xB2", descricao: "Mock de apartamento para testes gerado automaticamente para testes", categoria: "Apartamento", finalidade: "Venda", ativo: true, publicado: true, created_at: "2025-07-08T19:46:41.101Z", updated_at: "2025-07-08T19:46:41.101Z", qtd_quartos: 3, qtd_banheiro: 1, area_construida: 65, area_privativa: 98.25, area_total: 537.6, condominio: 237885, "corretor.codigo": 913157, qtd_suites: 1, end_logradouro: "Rua Mock 303", end_numero: "520", end_bairro: "Zona Sul", end_cidade: "Porto Alegre", end_estado: "PR", fotos: [ { id: "MOCK_FOTO_MOCK_TEST-APARTAMENTO_004_1", url: "https://images.unsplash.com/photo-1502672260266-1c1ef2d93688?w=800&q=80", descricao: "Apartamento Teste - Vista principal", destaque: true, ordem: 1 }, { id: "MOCK_FOTO_MOCK_TEST-APARTAMENTO_004_2", url: "https://images.unsplash.com/photo-1555041469-a586c61ea9bc?w=800&q=80", descricao: "Vista interior", destaque: false, ordem: 2 }, { id: "MOCK_FOTO_MOCK_TEST-APARTAMENTO_004_3", url: "https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=800&q=80", descricao: "Vista interior", destaque: false, ordem: 3 }, { id: "MOCK_FOTO_MOCK_TEST-APARTAMENTO_004_4", url: "https://images.unsplash.com/photo-1556909114-f6e7ad7d3136?w=800&q=80", descricao: "Vista interior", destaque: false, ordem: 4 } ] }, { codigo: "MOCK_TEST-COMERCIAL_002", titulo: "Comercial Teste - Mock 2", descricao: "Mock de im\xF3vel comercial para testes gerado automaticamente para testes", categoria: "Comercial", finalidade: "Loca\xE7\xE3o", ativo: true, publicado: true, created_at: "2025-07-08T19:46:41.101Z", updated_at: "2025-07-08T19:46:41.101Z", area_construida: 80, qtd_banheiro: 2, valor_locacao: 1500, andar: 1, area_privativa: 138, caracteristicas: "Lavanderia", categoria_imovel: "Padr\xE3o", end_logradouro: "Rua Mock 942", end_numero: "822", end_bairro: "Zona Sul", end_cidade: "Porto Alegre", end_estado: "SP", fotos: [ { id: "MOCK_FOTO_MOCK_TEST-COMERCIAL_002_1", url: "https://images.unsplash.com/photo-1462826303086-329426d1aef5?w=800&q=80", descricao: "Comercial Teste - Vista principal", destaque: true, ordem: 1 }, { id: "MOCK_FOTO_MOCK_TEST-COMERCIAL_002_2", url: "https://images.unsplash.com/photo-1497366216548-37526070297c?w=800&q=80", descricao: "Vista externa", destaque: false, ordem: 2 } ] }, { codigo: "MOCK_TEST-COMERCIAL_003", titulo: "Comercial Teste - Mock 3", descricao: "Mock de im\xF3vel comercial para testes gerado automaticamente para testes", categoria: "Comercial", finalidade: "Loca\xE7\xE3o", ativo: true, publicado: true, created_at: "2025-07-08T19:46:41.101Z", updated_at: "2025-07-08T19:46:41.101Z", area_construida: 50, andar: 1, caracteristicas: "Lavanderia", codigo_origem: "AR0015", condominio: 237952, "corretor.codigo": 1227644, end_logradouro: "Rua Herculano de Freitas", end_bairro: "Orf\xE3s", end_estado: "PR", end_cep: "84015-105", longitude: -50.16290679999999, fotos: [ { id: "MOCK_FOTO_MOCK_TEST-COMERCIAL_003_1", url: "https://images.unsplash.com/photo-1462826303086-329426d1aef5?w=800&q=80", descricao: "Comercial Teste - Vista principal", destaque: true, ordem: 1 }, { id: "MOCK_FOTO_MOCK_TEST-COMERCIAL_003_2", url: "https://images.unsplash.com/photo-1556909114-f6e7ad7d3136?w=800&q=80", descricao: "Vista interior", destaque: false, ordem: 2 }, { id: "MOCK_FOTO_MOCK_TEST-COMERCIAL_003_3", url: "https://images.unsplash.com/photo-1462826303086-329426d1aef5?w=800&q=80", descricao: "Vista externa", destaque: false, ordem: 3 }, { id: "MOCK_FOTO_MOCK_TEST-COMERCIAL_003_4", url: "https://images.unsplash.com/photo-1556909114-f6e7ad7d3136?w=800&q=80", descricao: "Vista interior", destaque: false, ordem: 4 } ] }, { codigo: "MOCK_TEST-CASA_003", titulo: "Casa Teste com 4 quartos, 120m\xB2", descricao: "Mock de casa para testes gerado automaticamente para testes", categoria: "Casa", finalidade: "Venda", ativo: true, publicado: true, created_at: "2025-07-08T19:46:41.101Z", updated_at: "2025-07-08T19:46:41.101Z", qtd_quartos: 4, qtd_banheiro: 3, area_construida: 120, area_terreno: 300, area_privativa: 100, area_total: 1, "corretor.codigo": 908223, end_numero: "263", end_bairro: "Zona Sul", end_cidade: "Curitiba", end_estado: "RJ", latitude: -25.0787607, longitude: -50.16290679999999, fotos: [ { id: "MOCK_FOTO_MOCK_TEST-CASA_003_1", url: "https://images.unsplash.com/photo-1583608205776-bfd35f0d9f83?w=800&q=80", descricao: "Casa Teste - Vista principal", destaque: true, ordem: 1 }, { id: "MOCK_FOTO_MOCK_TEST-CASA_003_2", url: "https://images.unsplash.com/photo-1555041469-a586c61ea9bc?w=800&q=80", descricao: "Vista interior", destaque: false, ordem: 2 }, { id: "MOCK_FOTO_MOCK_TEST-CASA_003_3", url: "https://images.unsplash.com/photo-1512917774080-9991f1c4c750?w=800&q=80", descricao: "Vista externa", destaque: false, ordem: 3 } ], qtd_suites: 1, end_logradouro: "Rua Mock 637" }, { codigo: "MOCK_TEST-APARTAMENTO_005", titulo: "Apartamento Teste - Mock 5", descricao: "Mock de apartamento para testes gerado automaticamente para testes", categoria: "Apartamento", finalidade: "Venda", ativo: true, publicado: true, created_at: "2025-07-08T19:46:41.101Z", updated_at: "2025-07-08T19:46:41.101Z", qtd_quartos: 3, qtd_banheiro: 2, valor_venda: 25e4, area_privativa: 15, area_total: 270, caracteristicas: "Lavanderia", categoria_imovel: "Padr\xE3o", condominio: 237318, "corretor.codigo": 908392, qtd_suites: 1, end_logradouro: "Rua Mock 139", end_numero: "827", end_bairro: "Jardins", end_cidade: "Rio de Janeiro", end_estado: "RS", fotos: [ { id: "MOCK_FOTO_MOCK_TEST-APARTAMENTO_005_1", url: "https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=800&q=80", descricao: "Apartamento Teste - Vista principal", destaque: true, ordem: 1 }, { id: "MOCK_FOTO_MOCK_TEST-APARTAMENTO_005_2", url: "https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=800&q=80", descricao: "Vista interior", destaque: false, ordem: 2 }, { id: "MOCK_FOTO_MOCK_TEST-APARTAMENTO_005_3", url: "https://images.unsplash.com/photo-1522708323590-d24dbb6b0267?w=800&q=80", descricao: "Vista externa", destaque: false, ordem: 3 } ] }, { codigo: "MOCK_TEST-APARTAMENTO_006", titulo: "Apartamento Teste com 3 quartos, 85m\xB2", descricao: "Mock de apartamento para testes gerado automaticamente para testes", categoria: "Apartamento", finalidade: "Venda", ativo: true, publicado: true, created_at: "2025-07-08T19:46:41.101Z", updated_at: "2025-07-08T19:46:41.101Z", qtd_quartos: 3, area_construida: 85, valor_venda: 45e4, caracteristicas: "Em condom\xEDnio fechado", categoria_imovel: "Padr\xE3o", "corretor.codigo": 908381, qtd_suites: 1, end_logradouro: "Rua Mock 531", end_numero: "442", end_bairro: "Zona Sul", end_cidade: "S\xE3o Paulo", end_estado: "RJ", fotos: [ { id: "MOCK_FOTO_MOCK_TEST-APARTAMENTO_006_1", url: "https://images.unsplash.com/photo-1522708323590-d24dbb6b0267?w=800&q=80", descricao: "Apartamento Teste - Vista principal", destaque: true, ordem: 1 }, { id: "MOCK_FOTO_MOCK_TEST-APARTAMENTO_006_2", url: "https://images.unsplash.com/photo-1555041469-a586c61ea9bc?w=800&q=80", descricao: "Vista interior", destaque: false, ordem: 2 }, { id: "MOCK_FOTO_MOCK_TEST-APARTAMENTO_006_3", url: "https://images.unsplash.com/photo-1555041469-a586c61ea9bc?w=800&q=80", descricao: "Vista interior", destaque: false, ordem: 3 }, { id: "MOCK_FOTO_MOCK_TEST-APARTAMENTO_006_4", url: "https://images.unsplash.com/photo-1556909114-f6e7ad7d3136?w=800&q=80", descricao: "Vista interior", destaque: false, ordem: 4 } ] }, { codigo: "MOCK_TEST-COMERCIAL_004", titulo: "Comercial Teste - Mock 4", descricao: "Mock de im\xF3vel comercial para testes gerado automaticamente para testes", categoria: "Comercial", finalidade: "Loca\xE7\xE3o", ativo: true, publicado: true, created_at: "2025-07-08T19:46:41.101Z", updated_at: "2025-07-08T19:46:41.101Z", area_construida: 30, qtd_banheiro: 2, valor_locacao: 3e3, andar: 5, area_privativa: 15, area_total: 307.5, caracteristicas: "Churrasqueira", categoria_imovel: "Padr\xE3o", codigo_origem: "SO0609", condominio: 237652, end_logradouro: "Rua Mock 311", end_numero: "570", end_bairro: "Vila Nova", end_cidade: "S\xE3o Paulo", end_estado: "SP", fotos: [ { id: "MOCK_FOTO_MOCK_TEST-COMERCIAL_004_1", url: "https://images.unsplash.com/photo-1497366216548-37526070297c?w=800&q=80", descricao: "Comercial Teste - Vista principal", destaque: true, ordem: 1 }, { id: "MOCK_FOTO_MOCK_TEST-COMERCIAL_004_2", url: "https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=800&q=80", descricao: "Vista interior", destaque: false, ordem: 2 } ] }, { codigo: "MOCK_TEST-CASA_004", titulo: "Casa Teste com 3 quartos, 180m\xB2", descricao: "Mock de casa para testes gerado automaticamente para testes", categoria: "Casa", finalidade: "Venda", ativo: true, publicado: true, created_at: "2025-07-08T19:46:41.101Z", updated_at: "2025-07-08T19:46:41.101Z", qtd_quartos: 3, area_construida: 180, area_terreno: 200, valor_venda: 55e4, caracteristicas: "Porcelanato", categoria_imovel: "Padr\xE3o", codigo_origem: "SO0609", qtd_suites: 1, end_logradouro: "Rua Mock 93", end_numero: "423", end_bairro: "Vila Nova", end_cidade: "Curitiba", end_estado: "PR", fotos: [ { id: "MOCK_FOTO_MOCK_TEST-CASA_004_1", url: "https://images.unsplash.com/photo-1512917774080-9991f1c4c750?w=800&q=80", descricao: "Casa Teste - Vista principal", destaque: true, ordem: 1 }, { id: "MOCK_FOTO_MOCK_TEST-CASA_004_2", url: "https://images.unsplash.com/photo-1556909114-f6e7ad7d3136?w=800&q=80", descricao: "Vista interior", destaque: false, ordem: 2 } ] }, { codigo: "MOCK_TEST-APARTAMENTO_007", titulo: "Apartamento Teste com 1 quartos, 85m\xB2", descricao: "Mock de apartamento para testes gerado automaticamente para testes", categoria: "Apartamento", finalidade: "Venda", ativo: true, publicado: true, created_at: "2025-07-08T19:46:41.101Z", updated_at: "2025-07-08T19:46:41.101Z", qtd_quartos: 1, qtd_banheiro: 2, area_construida: 85, valor_venda: 45e4, area_total: 270, caracteristicas: "Cozinha", codigo_origem: "GD0002", "corretor.codigo": 908218, end_logradouro: "Rua Francisco Ribas", end_numero: 1012, end_bairro: "Orf\xE3s", end_cidade: "Ponta Grossa", end_estado: "PR", longitude: -50.1623448, fotos: [ { id: "MOCK_FOTO_MOCK_TEST-APARTAMENTO_007_1", url: "https://images.unsplash.com/photo-1502672260266-1c1ef2d93688?w=800&q=80", descricao: "Apartamento Teste - Vista principal", destaque: true, ordem: 1 }, { id: "MOCK_FOTO_MOCK_TEST-APARTAMENTO_007_2", url: "https://images.unsplash.com/photo-1556909114-f6e7ad7d3136?w=800&q=80", descricao: "Vista interior", destaque: false, ordem: 2 } ] }, { codigo: "MOCK_TEST-APARTAMENTO_008", titulo: "Apartamento Teste - Mock 8", descricao: "Mock de apartamento para testes gerado automaticamente para testes", categoria: "Apartamento", finalidade: "Venda", ativo: true, publicado: true, created_at: "2025-07-08T19:46:41.101Z", updated_at: "2025-07-08T19:46:41.101Z", valor_venda: 45e4, area_privativa: 0, condominio: 237321, "corretor.codigo": 908392, end_logradouro: "Rua Herculano de Freitas", end_numero: 667, end_bairro: "Orf\xE3s", end_cidade: "Ponta Grossa", end_estado: "PR", latitude: -25.0787607, longitude: -50.16290679999999, fotos: [ { id: "MOCK_FOTO_MOCK_TEST-APARTAMENTO_008_1", url: "https://images.unsplash.com/photo-1502672260266-1c1ef2d93688?w=800&q=80", descricao: "Apartamento Teste - Vista principal", destaque: true, ordem: 1 }, { id: "MOCK_FOTO_MOCK_TEST-APARTAMENTO_008_2", url: "https://images.unsplash.com/photo-1555041469-a586c61ea9bc?w=800&q=80", descricao: "Vista interior", destaque: false, ordem: 2 }, { id: "MOCK_FOTO_MOCK_TEST-APARTAMENTO_008_3", url: "https://images.unsplash.com/photo-1555041469-a586c61ea9bc?w=800&q=80", descricao: "Vista interior", destaque: false, ordem: 3 } ] }, { codigo: "MOCK_TEST-COMERCIAL_005", titulo: "Comercial Teste - Mock 5", descricao: "Mock de im\xF3vel comercial para testes gerado automaticamente para testes", categoria: "Comercial", finalidade: "Loca\xE7\xE3o", ativo: true, publicado: true, created_at: "2025-07-08T19:46:41.101Z", updated_at: "2025-07-08T19:46:41.101Z", area_construida: 80, qtd_banheiro: 2, valor_locacao: 3e3, andar: 10, area_total: 5782, categoria_imovel: "Padr\xE3o", codigo_origem: "SO0607", condominio: 237318, "corretor.codigo": 913153, end_numero: "995", end_bairro: "Jardins", end_cidade: "S\xE3o Paulo", end_estado: "RS", end_cep: "84015-000", latitude: -25.0808545, longitude: -50.1623448, fotos: [ { id: "MOCK_FOTO_MOCK_TEST-COMERCIAL_005_1", url: "https://images.unsplash.com/photo-1497366811353-6870744d04b2?w=800&q=80", descricao: "Comercial Teste - Vista principal", destaque: true, ordem: 1 }, { id: "MOCK_FOTO_MOCK_TEST-COMERCIAL_005_2", url: "https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=800&q=80", descricao: "Vista interior", destaque: false, ordem: 2 } ], end_logradouro: "Rua Mock 307" }, { codigo: "MOCK_TEST-CASA_005", titulo: "Casa Teste - Mock 5", descricao: "Mock de casa para testes gerado automaticamente para testes", categoria: "Casa", finalidade: "Venda", ativo: true, publicado: true, created_at: "2025-07-08T19:46:41.101Z", updated_at: "2025-07-08T19:46:41.101Z", qtd_quartos: 3, qtd_banheiro: 3, area_terreno: 200, valor_venda: 55e4, codigo_origem: "AR0015", condominio: 237321, "corretor.codigo": 908410, end_logradouro: "Rua Lauro Bittencourt Neto", end_bairro: "Jardim Carvalho", end_cidade: "Ponta Grossa", end_estado: "PR", fotos: [ { id: "MOCK_FOTO_MOCK_TEST-CASA_005_1", url: "https://images.unsplash.com/photo-1512917774080-9991f1c4c750?w=800&q=80", descricao: "Casa Teste - Vista principal", destaque: true, ordem: 1 }, { id: "MOCK_FOTO_MOCK_TEST-CASA_005_2", url: "https://images.unsplash.com/photo-1512917774080-9991f1c4c750?w=800&q=80", descricao: "Vista externa", destaque: false, ordem: 2 }, { id: "MOCK_FOTO_MOCK_TEST-CASA_005_3", url: "https://images.unsplash.com/photo-1568605114967-8130f3a36994?w=800&q=80", descricao: "Vista externa", destaque: false, ordem: 3 } ], qtd_suites: 1 }, { codigo: "MOCK_TEST-COMERCIAL_006", titulo: "Comercial Teste - Mock 6", descricao: "Mock de im\xF3vel comercial para testes gerado automaticamente para testes", categoria: "Comercial", finalidade: "Loca\xE7\xE3o", ativo: true, publicado: true, created_at: "2025-07-08T19:46:41.101Z", updated_at: "2025-07-08T19:46:41.101Z", area_construida: 80, qtd_banheiro: 2, valor_locacao: 1500, andar: 10, area_privativa: 0, area_total: 0, caracteristicas: "Sala de estar", condominio: 237551, end_logradouro: "Rua Mock 411", end_numero: "449", end_bairro: "Vila Nova", end_cidade: "Rio de Janeiro", end_estado: "SP", fotos: [ { id: "MOCK_FOTO_MOCK_TEST-COMERCIAL_006_1", url: "https://images.unsplash.com/photo-1462826303086-329426d1aef5?w=800&q=80", descricao: "Comercial Teste - Vista principal", destaque: true, ordem: 1 }, { id: "MOCK_FOTO_MOCK_TEST-COMERCIAL_006_2", url: "https://images.unsplash.com/photo-1524758631624-e2822e304c36?w=800&q=80", descricao: "Vista externa", destaque: false, ordem: 2 }, { id: "MOCK_FOTO_MOCK_TEST-COMERCIAL_006_3", url: "https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=800&q=80", descricao: "Vista interior", destaque: false, ordem: 3 }, { id: "MOCK_FOTO_MOCK_TEST-COMERCIAL_006_4", url: "https://images.unsplash.com/photo-1497366216548-37526070297c?w=800&q=80", descricao: "Vista externa", destaque: false, ordem: 4 } ] }, { codigo: "MOCK_TEST-APARTAMENTO_009", titulo: "Apartamento Teste com 2 quartos, 45m\xB2", descricao: "Mock de apartamento para testes gerado automaticamente para testes", categoria: "Apartamento", finalidade: "Venda", ativo: true, publicado: true, created_at: "2025-07-08T19:46:41.101Z", updated_at: "2025-07-08T19:46:41.101Z", qtd_quartos: 2, qtd_banheiro: 2, area_construida: 45, valor_venda: 25e4, area_privativa: 98.25, caracteristicas: "Em condom\xEDnio fechado", condominio: 237643, end_logradouro: "Rua Mathias de Albuquerque", end_bairro: "Oficinas", end_cep: "84036140", longitude: -50.1481246948242, fotos: [ { id: "MOCK_FOTO_MOCK_TEST-APARTAMENTO_009_1", url: "https://images.unsplash.com/photo-1502672260266-1c1ef2d93688?w=800&q=80", descricao: "Apartamento Teste - Vista principal", destaque: true, ordem: 1 }, { id: "MOCK_FOTO_MOCK_TEST-APARTAMENTO_009_2", url: "https://images.unsplash.com/photo-1556909114-f6e7ad7d3136?w=800&q=80", descricao: "Vista interior", destaque: false, ordem: 2 }, { id: "MOCK_FOTO_MOCK_TEST-APARTAMENTO_009_3", url: "https://images.unsplash.com/photo-1556909114-f6e7ad7d3136?w=800&q=80", descricao: "Vista interior", destaque: false, ordem: 3 }, { id: "MOCK_FOTO_MOCK_TEST-APARTAMENTO_009_4", url: "https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=800&q=80", descricao: "Vista externa", destaque: false, ordem: 4 } ] } ]; // src/data/mock/problematicos.json var problematicos_default = [ { codigo: "EDGE_NULL_001", titulo: "Mock com campos nulos", descricao: null, categoria: "", valor_venda: 0, area_construida: null }, { codigo: "EDGE_EXTREME_001", titulo: "Mock com valores extremos", descricao: "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", qtd_quartos: 99, qtd_banheiro: 50, area_construida: 99999, valor_venda: 999999999, andar: 150 }, { codigo: "EDGE_SPECIAL_001", titulo: "Mock com caracteres especiais: \xE1\xE9\xED\xF3\xFA \xE7\xF1 @#$%", descricao: "Teste com emoji \u{1F3E0}\u{1F3E1}\u{1F3D8}\uFE0F e s\xEDmbolos", end_logradouro: 'Rua "Teste" & Cia', end_numero: "123/A", observacoes: "Texto com\nquebras\nde\nlinha" }, { codigo: "EDGE_EMPTY_001", titulo: "Mock com arrays vazios", descricao: "Teste de arrays vazios", fotos: [], caracteristicas: [], emp_fields: [] }, { codigo: "EDGE_INCONSISTENT_001", titulo: "Mock com dados inconsistentes", descricao: "Terreno com quartos", categoria: "Terreno", qtd_quartos: 3, area_construida: 200, valor_locacao: 5e3, finalidade: "Venda" }, { codigo: "EDGE_EMPTY_STRINGS_001", titulo: "", descricao: " ", categoria: null, end_cidade: "", end_bairro: " " }, { codigo: "EDGE_NEGATIVE_001", titulo: "Mock com valores negativos", descricao: "Valores negativos para testes", qtd_quartos: -1, area_construida: -500, valor_venda: -1e5, andar: -5 }, { codigo: "EDGE_WRONG_TYPES_001", titulo: "Mock com tipos incorretos", descricao: "Testes de valida\xE7\xE3o de tipos", qtd_quartos: "tr\xEAs", area_construida: "grande", valor_venda: "caro", ativo: "sim" } ]; // src/data/fake-data/apartamentos.json var apartamentos_default = [ { codigo: "FAKE_APARTAMENTOS_001", titulo: "Apartamento Premium - 1