@horizon-modules/arbo-crm-integration
Version:
Integração CRM Arbo para conversion de dados imobiliários para property-model-v3
1,489 lines (1,478 loc) • 185 kB
JavaScript
"use strict";
"use strict";
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/index.ts
var index_exports = {};
__export(index_exports, {
ArboApiClient: () => ArboApiClient,
ArboDownloader: () => ArboDownloader,
ProfilerService: () => ProfilerService,
convertArboToPropertyV3: () => convertArboToPropertyV3,
fakeData: () => fakeData,
testMocks: () => testMocks
});
module.exports = __toCommonJS(index_exports);
// 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
var import_fs = require("fs");
var import_path = require("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 import_fs.promises.access(this.outputDir);
} catch {
await import_fs.promises.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 = (0, import_path.join)(this.outputDir, fileName);
await import_fs.promises.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 import_fs.promises.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 = (0, import_path.join)(this.outputDir, file);
const content = await import_fs.promises.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
var fs2 = __toESM(require("fs"));
var path = __toESM(require("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: "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA