@horizon-integrations/si9-crm 1.1.7 → 1.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -908,7 +908,7 @@ var HorizonPropertySchemaBySi9 = {
908
908
  key: "website_show_in_core",
909
909
  type: "Boolean",
910
910
  categories: ["comercial"],
911
- ui: { label: "Mostrar no portal" },
911
+ ui: { label: "Publicado no n\xFAcleo" },
912
912
  audit: { origin: "si9:property", source: "website.showInCore" }
913
913
  },
914
914
  {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/schemas/si9-property-schema.zod.ts","../src/services/PropertyConverter/convertBaseFields.ts","../src/helpers/si9-labels.ts","../src/services/PropertyConverter/convertExtendedFields.ts","../src/services/PropertyConverter/index.ts","../src/services/PropertyDownloader.ts","../src/schemas/horizon-property-schema-by-si9.ts","../src/schemas/horizon-property-schema-by-si9.zod.ts"],"sourcesContent":["// Exportar função principal de conversão\nexport { convertSi9PropertyToHorizon } from \"./services/PropertyConverter\"\n\n// Exportar funções individuais do converter\nexport {\n convertBaseFields,\n convertExtendedFields,\n} from \"./services/PropertyConverter\"\n\n// Exportar serviços reutilizáveis\nexport { PropertyDownloader } from \"./services/PropertyDownloader\"\nexport type {\n SI9Credentials,\n PropertyDownloaderConfig,\n DownloadResult,\n} from \"./services/PropertyDownloader\"\nexport { SI9_DEFAULT_CREDENTIALS } from \"./services/PropertyDownloader\"\n\n// Exportar schemas TypeScript (Entity Schema)\nexport { HorizonPropertySchemaBySi9 } from \"./schemas/horizon-property-schema-by-si9\"\n\n// Exportar schema Zod de entrada (SI9)\nexport {\n Si9PropertySchemaZod,\n validateSi9PropertySchema,\n safeValidateSi9PropertySchema,\n type Si9PropertySchema,\n} from \"./schemas/si9-property-schema.zod\"\n\n// Exportar schema Zod de saída (Horizon)\nexport {\n HorizonPropertySchemaBySi9Zod,\n validateHorizonPropertySchemaBySi9,\n safeValidateHorizonPropertySchemaBySi9,\n type HorizonPropertySchemaBySi9Type,\n} from \"./schemas/horizon-property-schema-by-si9.zod\"\n\n// Exportar helpers\nexport {\n FEATURES_LABELS,\n SECURITY_LABELS,\n RECREATION_LABELS,\n RURAL_LABELS,\n booleanFieldsToLabels,\n} from \"./helpers/si9-labels\"\n","import { z } from \"zod\"\n\n// ========================================\n// Sub-schemas SI9\n// ========================================\n\nconst categorySchema = z\n .object({\n id: z.number().nullish(),\n name: z.string().nullish(),\n })\n .passthrough()\n\nconst generalDataSchema = z\n .object({\n board: z.string().nullish(),\n situation: z.string().nullish(),\n category: categorySchema.nullish(),\n description: z.string().nullish(),\n title: z.string().nullish(),\n allotment: z.string().nullish(),\n costCenter: z.string().nullish(),\n urlVideo: z.string().nullish(),\n urlTour: z.string().nullish(),\n })\n .passthrough()\n\nconst destinationSchema = z\n .object({\n sale: z.boolean().nullish(),\n rent: z.boolean().nullish(),\n season: z.boolean().nullish(),\n private: z.boolean().nullish(),\n application: z.boolean().nullish(),\n exchange: z.boolean().nullish(),\n })\n .passthrough()\n\nconst valuesSchema = z\n .object({\n saleValue: z.number().nullish(),\n rentValue: z.number().nullish(),\n discountValue: z.number().nullish(),\n fciValue: z.number().nullish(),\n iptuValue: z.number().nullish(),\n assignedValue: z.number().nullish(),\n trashFee: z.number().nullish(),\n disasterFee: z.number().nullish(),\n condominiumFee: z.number().nullish(),\n })\n .passthrough()\n\nconst citySchema = z\n .object({\n id: z.union([z.number(), z.null()]).nullish(),\n name: z.string().nullish(),\n state: z.string().nullish(),\n })\n .passthrough()\n\nconst districtSchema = z\n .object({\n id: z.union([z.number(), z.null()]).nullish(),\n name: z.string().nullish(),\n })\n .passthrough()\n\nconst locationSchema = z\n .object({\n city: citySchema.nullish(),\n address: z.string().nullish(),\n number: z.string().nullish(),\n zipCode: z.string().nullish(),\n district: districtSchema.nullish(),\n apartment: z.string().nullish(),\n block: z.string().nullish(),\n floor: z.string().nullish(),\n quatrain: z.string().nullish(),\n lot: z.string().nullish(),\n complement: z.string().nullish(),\n referencePoint: z.string().nullish(),\n longitude: z.string().nullish(),\n latitude: z.string().nullish(),\n blocksMap: z.unknown().nullish(),\n })\n .passthrough()\n\nconst websiteSchema = z\n .object({\n highlight: z.boolean().nullish(),\n superHighlight: z.boolean().nullish(),\n showInCore: z.boolean().nullish(),\n mcmv: z.boolean().nullish(),\n })\n .passthrough()\n\nconst dimensionsSchema = z\n .object({\n buildingArea: z.number().nullish(),\n landArea: z.number().nullish(),\n usefulArea: z.number().nullish(),\n privateArea: z.number().nullish(),\n internalArea: z.number().nullish(),\n registeredArea: z.number().nullish(),\n totalArea: z.number().nullish(),\n commonArea: z.number().nullish(),\n garageArea: z.number().nullish(),\n frontSize: z.number().nullish(),\n fundsSize: z.number().nullish(),\n leftSize: z.number().nullish(),\n rightSize: z.number().nullish(),\n })\n .passthrough()\n\nconst featuresSchema = z\n .object({\n // Numéricos\n room: z.number().nullish(),\n kitchen: z.number().nullish(),\n bedroom: z.number().nullish(),\n suite: z.number().nullish(),\n closet: z.number().nullish(),\n bathroom: z.number().nullish(),\n toilet: z.number().nullish(),\n balcony: z.number().nullish(),\n coveredGarage: z.number().nullish(),\n outdoorGarage: z.number().nullish(),\n arCondicionado: z.number().nullish(),\n\n // Acabamentos (string/enum)\n floor: z.string().nullish(),\n roof: z.string().nullish(),\n ceiling: z.string().nullish(),\n paving: z.string().nullish(),\n pavement: z.string().nullish(),\n\n // Booleans\n shed: z.boolean().nullish(),\n needMaid: z.boolean().nullish(),\n serviceArea: z.boolean().nullish(),\n pantry: z.boolean().nullish(),\n furnished: z.boolean().nullish(),\n semiFurnished: z.boolean().nullish(),\n wineHouse: z.boolean().nullish(),\n fittedKitchen: z.boolean().nullish(),\n kennel: z.boolean().nullish(),\n waterTank: z.boolean().nullish(),\n barbecueGrill: z.boolean().nullish(),\n telephone: z.boolean().nullish(),\n porchWithGrill: z.boolean().nullish(),\n elevator: z.boolean().nullish(),\n porch: z.boolean().nullish(),\n winterGarden: z.boolean().nullish(),\n penthouseApartment: z.boolean().nullish(),\n highStandard: z.boolean().nullish(),\n release: z.boolean().nullish(),\n condominium: z.boolean().nullish(),\n inPlant: z.boolean().nullish(),\n coast: z.boolean().nullish(),\n serviceBathroom: z.boolean().nullish(),\n lounge: z.boolean().nullish(),\n onlineConcierge: z.boolean().nullish(),\n demiSuite: z.boolean().nullish(),\n newOrSemiNew: z.boolean().nullish(),\n })\n .passthrough()\n\nconst securitySchema = z\n .object({\n alarm: z.boolean().nullish(),\n electricFence: z.boolean().nullish(),\n intercom: z.boolean().nullish(),\n concierge: z.boolean().nullish(),\n walled: z.boolean().nullish(),\n gate: z.boolean().nullish(),\n electronicGate: z.boolean().nullish(),\n protectionGrid: z.boolean().nullish(),\n })\n .passthrough()\n\nconst recreationSchema = z\n .object({\n playgroud: z.boolean().nullish(), // typo da SI9 (sem \"n\")\n sauna: z.boolean().nullish(),\n pool: z.boolean().nullish(),\n gym: z.boolean().nullish(),\n fireplace: z.boolean().nullish(),\n gourmetSpace: z.boolean().nullish(),\n multisportCourt: z.boolean().nullish(),\n partyRoom: z.boolean().nullish(),\n whirlpool: z.boolean().nullish(),\n heating: z.string().nullish(),\n positionSun: z.string().nullish(),\n positionCourt: z.string().nullish(),\n })\n .passthrough()\n\nconst ruralSchema = z\n .object({\n river: z.boolean().nullish(),\n mine: z.boolean().nullish(),\n hose: z.boolean().nullish(),\n footballField: z.boolean().nullish(),\n bushels: z.number().nullish(),\n acre: z.number().nullish(),\n pasture: z.string().nullish(),\n mechanized: z.string().nullish(),\n reserve: z.number().nullish(),\n pigsty: z.number().nullish(),\n aviary: z.number().nullish(),\n weir: z.number().nullish(),\n woodHouse: z.number().nullish(),\n brickHouse: z.number().nullish(),\n mixedHouse: z.number().nullish(),\n })\n .passthrough()\n\nconst companySchema = z\n .object({\n id: z.number().nullish(),\n fancyName: z.string().nullish(),\n corporateName: z.string().nullish(),\n address: z.string().nullish(),\n phoneNumber: z.string().nullish(),\n siteUrl: z.string().nullish(),\n })\n .passthrough()\n\nconst imageSchema = z\n .object({\n url: z.string().nullish(),\n subtitle: z.string().nullish(),\n displaySite: z.boolean().nullish(),\n pic360: z.union([z.boolean(), z.string()]).nullish(),\n })\n .passthrough()\n\nconst fieldSchema = z\n .object({\n field: z.string().nullish(),\n value: z.unknown().nullish(),\n })\n .passthrough()\n\n// ========================================\n// Schema principal SI9\n// ========================================\n\nconst brokerSchema = z\n .object({\n id: z.number().nullish(),\n name: z.string().nullish(),\n cellphone: z.string().nullish(),\n photoUrl: z.string().nullish(),\n creci: z.string().nullish(),\n })\n .passthrough()\n\nexport const Si9PropertySchemaZod = z\n .object({\n id: z.number(),\n generalData: generalDataSchema.nullish(),\n destination: destinationSchema.nullish(),\n values: valuesSchema.nullish(),\n location: locationSchema.nullish(),\n website: websiteSchema.nullish(),\n dimensions: dimensionsSchema.nullish(),\n features: featuresSchema.nullish(),\n security: securitySchema.nullish(),\n recreation: recreationSchema.nullish(),\n rural: ruralSchema.nullish(),\n company: companySchema.nullish(),\n broker: brokerSchema.nullish(),\n images: z.array(imageSchema).nullish(),\n fields: z.array(fieldSchema).nullish(),\n })\n .passthrough()\n\n// Tipo inferido\nexport type Si9PropertySchema = z.infer<typeof Si9PropertySchemaZod>\n\n// Helper de validação\nexport const validateSi9PropertySchema = (data: unknown): Si9PropertySchema => {\n return Si9PropertySchemaZod.parse(data)\n}\n\n// Helper de validação safe\nexport const safeValidateSi9PropertySchema = (data: unknown) => {\n return Si9PropertySchemaZod.safeParse(data)\n}\n","import type { Si9PropertySchema } from \"../../schemas/si9-property-schema.zod\"\nimport type { HorizonPropertySchemaBySi9Type } from \"../../schemas/horizon-property-schema-by-si9.zod\"\n\n/**\n * Mapa de chaves reconhecidas nos fields customizados\n * Nomes em português legível (aparecem nos portais)\n */\nconst FIELDS_RECONHECIDOS: Record<\n string,\n (result: Partial<HorizonPropertySchemaBySi9Type>, value: string) => void\n> = {\n \"Geolocalização aproximada\": (result, _value) => {\n // geo_aproximado é objeto { lat, lng } — só pode ser preenchido se já tiver lat/lng\n // Será tratado após o processamento de coordenadas\n },\n}\n\n/**\n * Converte campos do schema base Horizon (campos padrão que existem em todos os property models)\n * Conforme PLANO_CONVERSOR.md\n */\nexport function convertBaseFields(\n imovel: Si9PropertySchema,\n): Partial<HorizonPropertySchemaBySi9Type> {\n const result: Partial<HorizonPropertySchemaBySi9Type> = {}\n\n // ========== IDENTIFICAÇÃO BÁSICA ==========\n result.reference = String(imovel.id)\n result.title = imovel.generalData?.title || \"Sem título\"\n result.description = imovel.generalData?.description || \"Sem descrição\"\n\n // SI9 não tem campo de data de atualização — usar data da sincronização\n result.source_updated_at = new Date().toISOString()\n\n // source_published_at: deixar vazio (CRM tem dtCadastro mas API não expõe)\n\n // ========== CONFIGURAÇÕES ==========\n result.currency = \"BRL\"\n result.unit_area = \"m2\"\n result.unit_distance = \"meters\"\n\n // ========== OPERAÇÃO ==========\n const dest = imovel.destination\n if (dest) {\n const operacao: (\"venda\" | \"locacao\" | \"temporada\")[] = []\n if (dest.sale) operacao.push(\"venda\")\n if (dest.rent) operacao.push(\"locacao\")\n if (dest.season) operacao.push(\"temporada\")\n if (operacao.length > 0) result.operacao = operacao\n }\n\n // ========== TIPO ==========\n if (imovel.generalData?.category?.name) {\n result.tipo = imovel.generalData.category.name\n }\n\n // ========== VALORES MONETÁRIOS ==========\n // Valores em REAIS (R$) — NÃO dividir por 100\n const values = imovel.values\n if (values) {\n if (values.saleValue && values.saleValue > 0 && imovel.destination?.sale) {\n result.valor_venda = values.saleValue\n }\n if (values.rentValue && values.rentValue > 0 && imovel.destination?.rent) {\n result.valor_locacao = values.rentValue\n }\n if (values.condominiumFee && values.condominiumFee > 0) {\n result.valor_condominio = values.condominiumFee\n }\n if (values.iptuValue && values.iptuValue > 0) {\n result.valor_iptu = values.iptuValue\n }\n }\n\n // ========== ÁREAS ==========\n const dim = imovel.dimensions\n if (dim) {\n if (dim.totalArea && dim.totalArea > 0) result.area_total = dim.totalArea\n if (dim.privateArea && dim.privateArea > 0)\n result.area_privativa = dim.privateArea\n if (dim.usefulArea && dim.usefulArea > 0) result.area_util = dim.usefulArea\n }\n\n // ========== DEPENDÊNCIAS (features numéricos) ==========\n const feat = imovel.features\n if (feat) {\n if (feat.bedroom && feat.bedroom > 0) result.dormitorios = feat.bedroom\n if (feat.suite && feat.suite > 0) result.suites = feat.suite\n\n // Banheiros = só bathroom (toilet/lavabo vai como campo extra separado)\n if (feat.bathroom && feat.bathroom > 0) result.banheiros = feat.bathroom\n\n // Garagens = coveredGarage + outdoorGarage\n const covered = feat.coveredGarage || 0\n const outdoor = feat.outdoorGarage || 0\n const totalGaragens = covered + outdoor\n if (totalGaragens > 0) result.vagas_garagem = totalGaragens\n }\n\n // ========== ENDEREÇO ==========\n const loc = imovel.location\n if (loc) {\n // CEP: formatar 00000-000\n if (loc.zipCode) {\n const cepLimpo = loc.zipCode.replace(/\\D/g, \"\")\n if (cepLimpo.length === 8) {\n result.endereco_cep = `${cepLimpo.slice(0, 5)}-${cepLimpo.slice(5)}`\n } else {\n result.endereco_cep = loc.zipCode\n }\n }\n\n if (loc.city?.state) result.endereco_estado = loc.city.state\n if (loc.city?.name) result.endereco_cidade = loc.city.name\n if (loc.district?.name) result.endereco_bairro = loc.district.name\n if (loc.address) result.endereco_logradouro = loc.address\n if (loc.number) result.endereco_numero = loc.number\n if (loc.complement) result.endereco_complemento = loc.complement\n if (loc.referencePoint) result.endereco_referencia = loc.referencePoint\n\n // Coordenadas (vem como string, converter para number)\n if (loc.latitude && loc.longitude) {\n const lat = Number(loc.latitude)\n const lng = Number(loc.longitude)\n if (!isNaN(lat) && !isNaN(lng) && lat !== 0 && lng !== 0) {\n result.lat = lat\n result.lng = lng\n }\n }\n }\n\n // ========== CORRETOR (broker nativo da API) ==========\n if (imovel.broker?.id) {\n result.corretor_key = String(imovel.broker.id)\n }\n if (imovel.broker?.name) {\n result.corretor_nome = imovel.broker.name\n }\n\n // ========== CONDOMÍNIO ==========\n if (imovel.generalData?.allotment) {\n result.condominio_nome = imovel.generalData.allotment\n }\n\n // ========== DESTAQUE ==========\n if (imovel.website?.highlight || imovel.website?.superHighlight) {\n result.destaque = true\n }\n\n // ========== IMAGENS ==========\n if (imovel.images && imovel.images.length > 0) {\n // Filtrar apenas imagens com displaySite=true (ou sem a flag)\n const visibleImages = imovel.images.filter(\n (img) => img.displaySite !== false && img.url,\n )\n\n result.images = visibleImages.map((img, index) => ({\n full: img.url || \"\",\n md: img.url || \"\",\n sm: img.url || \"\",\n cover: index === 0,\n }))\n\n // Main image = primeira imagem\n if (visibleImages.length > 0 && visibleImages[0].url) {\n result.main_image = {\n full: visibleImages[0].url,\n md: visibleImages[0].url,\n sm: visibleImages[0].url,\n }\n }\n } else {\n result.images = []\n }\n\n // ========== VÍDEOS ==========\n if (imovel.generalData?.urlVideo) {\n const url = imovel.generalData.urlVideo\n result.videos = [\n {\n url,\n embed_url: url,\n },\n ]\n } else {\n result.videos = []\n }\n\n // ========== TOURS VIRTUAIS ==========\n if (imovel.generalData?.urlTour) {\n result.virtual_tours = [\n {\n embed_url: imovel.generalData.urlTour,\n },\n ]\n } else {\n result.virtual_tours = []\n }\n\n // ========== SEO ==========\n // Não fabricar fallbacks — se o CRM não tem SEO nativo, fica vazio\n // O front-end resolve na hora de renderizar\n\n // ========== FIELDS → chaves reconhecidas ==========\n const fields = imovel.fields\n if (fields && fields.length > 0) {\n // Chaves reconhecidas: copiar pra campos Horizon\n for (const f of fields) {\n if (!f.field) continue\n const handler = FIELDS_RECONHECIDOS[String(f.field)]\n if (handler) {\n handler(result, String(f.value || \"\"))\n }\n }\n\n // geo_aproximado: se \"Geolocalização aproximada\" existe E temos lat/lng\n const hasGeoField = fields.some(\n (f) => String(f.field) === \"Geolocalização aproximada\",\n )\n if (hasGeoField && result.lat && result.lng) {\n result.geo_aproximado = {\n lat: result.lat,\n lng: result.lng,\n }\n }\n }\n\n return result\n}\n","/**\n * Mapas de tradução boolean → label PT-BR para campos da SI9\n * Converte campos booleanos `true` em arrays de strings descritivas\n */\n\n// ========================================\n// Features (características do imóvel)\n// ========================================\nexport const FEATURES_LABELS: Record<string, string> = {\n shed: \"Galpão\",\n needMaid: \"Dependência de empregada\",\n serviceArea: \"Área de serviço\",\n pantry: \"Despensa\",\n furnished: \"Mobiliado\",\n semiFurnished: \"Semi-mobiliado\",\n wineHouse: \"Adega\",\n fittedKitchen: \"Cozinha planejada\",\n kennel: \"Canil\",\n waterTank: \"Cisterna\",\n barbecueGrill: \"Churrasqueira\",\n telephone: \"Telefone\",\n porchWithGrill: \"Varanda gourmet\",\n elevator: \"Elevador\",\n porch: \"Varanda\",\n winterGarden: \"Jardim de inverno\",\n penthouseApartment: \"Cobertura\",\n highStandard: \"Alto padrão\",\n release: \"Lançamento\",\n condominium: \"Condomínio\",\n inPlant: \"Na planta\",\n coast: \"Litoral\",\n serviceBathroom: \"Banheiro de serviço\",\n lounge: \"Sala de estar\",\n onlineConcierge: \"Portaria online\",\n demiSuite: \"Demi-suíte\",\n newOrSemiNew: \"Novo ou seminovo\",\n}\n\n// ========================================\n// Security (segurança)\n// ========================================\nexport const SECURITY_LABELS: Record<string, string> = {\n alarm: \"Alarme\",\n electricFence: \"Cerca elétrica\",\n intercom: \"Interfone\",\n concierge: \"Portaria\",\n walled: \"Murado\",\n gate: \"Portão\",\n electronicGate: \"Portão eletrônico\",\n protectionGrid: \"Grade de proteção\",\n}\n\n// ========================================\n// Recreation (lazer)\n// ========================================\nexport const RECREATION_LABELS: Record<string, string> = {\n playgroud: \"Playground\", // typo da SI9 (sem \"n\")\n sauna: \"Sauna\",\n pool: \"Piscina\",\n gym: \"Academia\",\n fireplace: \"Lareira\",\n gourmetSpace: \"Espaço gourmet\",\n multisportCourt: \"Quadra poliesportiva\",\n partyRoom: \"Salão de festas\",\n whirlpool: \"Hidromassagem\",\n}\n\n// ========================================\n// Rural (características rurais)\n// ========================================\nexport const RURAL_LABELS: Record<string, string> = {\n river: \"Rio\",\n mine: \"Mina\",\n hose: \"Mangueira\",\n footballField: \"Campo de futebol\",\n}\n\n// ========================================\n// Enums (campos string com valores fixos)\n// ========================================\n\nexport const SITUATION_LABELS: Record<string, string> = {\n AVALIABLE: \"Disponível\",\n INACTIVE: \"Inativo\",\n RENTED: \"Alugado\",\n RESERVED: \"Reservado\",\n SOLD: \"Vendido\",\n INVOICE: \"Em faturamento\",\n TODOCUMENT: \"Em documentação\",\n DELETE: \"Excluído\",\n TERMINATION: \"Rescisão\",\n RENOVATION: \"Em reforma\",\n}\n\nexport const HEATING_LABELS: Record<string, string> = {\n GAS: \"Gás\",\n SOLAR: \"Solar\",\n ELETRIC: \"Elétrico\",\n}\n\nexport const POSITION_SUN_LABELS: Record<string, string> = {\n NORTH: \"Norte\",\n SOUTH: \"Sul\",\n EAST: \"Leste\",\n WEST: \"Oeste\",\n}\n\nexport const POSITION_COURT_LABELS: Record<string, string> = {\n MIDDLE_COURT: \"Meio de quadra\",\n CORNER: \"Esquina\",\n SUB_CORNER: \"Sub-esquina\",\n}\n\nexport const PAVEMENT_LABELS: Record<string, string> = {\n COBBLESTONE: \"Paralelepípedo\",\n ASPHALT: \"Asfalto\",\n GRAVEL: \"Cascalho\",\n}\n\n// ========================================\n// Helpers\n// ========================================\n\n/**\n * Traduz um valor de enum usando mapa de labels\n * Retorna o valor original se não encontrar tradução\n */\nexport function enumToLabel(\n value: string | null | undefined,\n labelMap: Record<string, string>,\n): string | null {\n if (!value) return null\n return labelMap[value] ?? value\n}\n\n// ========================================\n// Helper genérico\n// ========================================\n\n/**\n * Converte um objeto com campos booleanos em um array de labels PT-BR\n * Filtra apenas os campos que são `true` (ignora false/null/undefined)\n *\n * @param obj Objeto com campos booleanos (ex: features, security, recreation)\n * @param labelMap Mapa de tradução (ex: FEATURES_LABELS)\n * @returns Array de labels em PT-BR\n */\nexport function booleanFieldsToLabels(\n obj: Record<string, unknown> | null | undefined,\n labelMap: Record<string, string>,\n): string[] {\n if (!obj) return []\n\n const labels: string[] = []\n\n for (const [key, label] of Object.entries(labelMap)) {\n if (obj[key] === true) {\n labels.push(label)\n }\n }\n\n return labels\n}\n","import type { Si9PropertySchema } from \"../../schemas/si9-property-schema.zod\"\nimport type { HorizonPropertySchemaBySi9Type } from \"../../schemas/horizon-property-schema-by-si9.zod\"\nimport {\n FEATURES_LABELS,\n SECURITY_LABELS,\n RECREATION_LABELS,\n RURAL_LABELS,\n SITUATION_LABELS,\n HEATING_LABELS,\n POSITION_SUN_LABELS,\n POSITION_COURT_LABELS,\n PAVEMENT_LABELS,\n booleanFieldsToLabels,\n enumToLabel,\n} from \"../../helpers/si9-labels\"\n\n/**\n * Converte campos específicos do SI9 (não existem no schema base Horizon)\n *\n * Convenção (Regras de Normalização):\n * - Regra 3: campos aninhados ganham prefixo do grupo (dimensions_, features_, etc.)\n * - Regra 4: booleans agrupados viram array (features, security, recreation, rural)\n * - Regra 5: tudo snake_case minúsculo\n */\nexport function convertExtendedFields(\n imovel: Si9PropertySchema,\n): Partial<HorizonPropertySchemaBySi9Type> {\n const result: Partial<HorizonPropertySchemaBySi9Type> = {}\n\n // ========== values.* ==========\n const values = imovel.values\n if (values) {\n if (values.discountValue && values.discountValue > 0)\n result.values_discount_value = values.discountValue\n if (values.fciValue && values.fciValue > 0)\n result.values_fci_value = values.fciValue\n if (values.assignedValue && values.assignedValue > 0)\n result.values_assigned_value = values.assignedValue\n if (values.trashFee && values.trashFee > 0)\n result.values_trash_fee = values.trashFee\n if (values.disasterFee && values.disasterFee > 0)\n result.values_disaster_fee = values.disasterFee\n }\n\n // ========== general_data.* ==========\n const ACCEPTED_SITUATIONS = [\"SOLD\", \"RENTED\", \"RESERVED\"]\n if (imovel.generalData?.situation && ACCEPTED_SITUATIONS.includes(imovel.generalData.situation))\n result.general_data_situation = imovel.generalData.situation\n if (imovel.generalData?.board)\n result.general_data_board = imovel.generalData.board\n // general_data_allotment REMOVIDO — já vai pro condominio_nome no base\n\n // ========== website.* ==========\n if (imovel.website?.superHighlight === true)\n result.website_super_highlight = true\n if (imovel.website?.showInCore === true)\n result.website_show_in_core = true\n if (imovel.website?.mcmv === true)\n result.website_mcmv = true\n\n // ========== destination.* ==========\n if (imovel.destination?.exchange === true)\n result.destination_exchange = true\n\n // ========== location.* (complementar) ==========\n const loc = imovel.location\n if (loc) {\n if (loc.apartment) result.location_apartment = loc.apartment\n if (loc.block) result.location_block = loc.block\n if (loc.floor) result.location_floor = loc.floor\n if (loc.quatrain) result.location_quatrain = loc.quatrain\n if (loc.lot) result.location_lot = loc.lot\n }\n\n // ========== dimensions.* ==========\n const dim = imovel.dimensions\n if (dim) {\n if (dim.buildingArea && dim.buildingArea > 0)\n result.dimensions_building_area = dim.buildingArea\n if (dim.landArea && dim.landArea > 0)\n result.dimensions_land_area = dim.landArea\n if (dim.internalArea && dim.internalArea > 0)\n result.dimensions_internal_area = dim.internalArea\n if (dim.registeredArea && dim.registeredArea > 0)\n result.dimensions_registered_area = dim.registeredArea\n if (dim.commonArea && dim.commonArea > 0)\n result.dimensions_common_area = dim.commonArea\n if (dim.garageArea && dim.garageArea > 0)\n result.dimensions_garage_area = dim.garageArea\n if (dim.frontSize && dim.frontSize > 0)\n result.dimensions_front_size = dim.frontSize\n if (dim.fundsSize && dim.fundsSize > 0)\n result.dimensions_funds_size = dim.fundsSize\n if (dim.leftSize && dim.leftSize > 0)\n result.dimensions_left_size = dim.leftSize\n if (dim.rightSize && dim.rightSize > 0)\n result.dimensions_right_size = dim.rightSize\n }\n\n // ========== features (booleans → array) ==========\n const feat = imovel.features\n const features = booleanFieldsToLabels(\n feat as Record<string, unknown> | undefined,\n FEATURES_LABELS,\n )\n if (features.length > 0) result.features = features\n\n // ========== features.* (numbers/strings) ==========\n if (feat) {\n if (feat.room && feat.room > 0) result.features_room = feat.room\n if (feat.kitchen && feat.kitchen > 0) result.features_kitchen = feat.kitchen\n if (feat.closet && feat.closet > 0) result.features_closet = feat.closet\n if (feat.balcony && feat.balcony > 0) result.features_balcony = feat.balcony\n if (feat.arCondicionado && feat.arCondicionado > 0)\n result.features_ar_condicionado = feat.arCondicionado\n if (feat.toilet && feat.toilet > 0) result.features_toilet = feat.toilet\n if (feat.floor) result.features_floor = feat.floor\n if (feat.roof) result.features_roof = feat.roof\n if (feat.ceiling) result.features_ceiling = feat.ceiling\n if (feat.paving) result.features_paving = feat.paving\n if (feat.pavement) result.features_pavement = feat.pavement\n }\n\n // ========== security (booleans → array) ==========\n const security = booleanFieldsToLabels(\n imovel.security as Record<string, unknown> | undefined,\n SECURITY_LABELS,\n )\n if (security.length > 0) result.security = security\n\n // ========== recreation (booleans → array) ==========\n const recreation = booleanFieldsToLabels(\n imovel.recreation as Record<string, unknown> | undefined,\n RECREATION_LABELS,\n )\n if (recreation.length > 0) result.recreation = recreation\n\n // ========== recreation.* (enums) ==========\n if (imovel.recreation?.heating)\n result.recreation_heating = imovel.recreation.heating\n if (imovel.recreation?.positionSun)\n result.recreation_position_sun = imovel.recreation.positionSun\n if (imovel.recreation?.positionCourt)\n result.recreation_position_court = imovel.recreation.positionCourt\n\n // ========== rural (booleans → array) ==========\n const rural = imovel.rural\n if (rural) {\n const ruralLabels = booleanFieldsToLabels(\n rural as Record<string, unknown>,\n RURAL_LABELS,\n )\n if (ruralLabels.length > 0) result.rural = ruralLabels\n\n // rural.* (numbers/strings)\n if (rural.bushels && rural.bushels > 0) result.rural_bushels = rural.bushels\n if (rural.acre && rural.acre > 0) result.rural_acre = rural.acre\n if (rural.pasture) result.rural_pasture = rural.pasture\n if (rural.mechanized) result.rural_mechanized = rural.mechanized\n if (rural.reserve && rural.reserve > 0) result.rural_reserve = rural.reserve\n if (rural.pigsty && rural.pigsty > 0) result.rural_pigsty = rural.pigsty\n if (rural.aviary && rural.aviary > 0) result.rural_aviary = rural.aviary\n if (rural.weir && rural.weir > 0) result.rural_weir = rural.weir\n if (rural.woodHouse && rural.woodHouse > 0)\n result.rural_wood_house = rural.woodHouse\n if (rural.brickHouse && rural.brickHouse > 0)\n result.rural_brick_house = rural.brickHouse\n if (rural.mixedHouse && rural.mixedHouse > 0)\n result.rural_mixed_house = rural.mixedHouse\n }\n\n // ========== fields (campos extras) ==========\n const fields = imovel.fields\n if (fields && fields.length > 0) {\n const fieldsFormatados = fields\n .filter((f) => f.field)\n .map((f) => ({\n field: String(f.field),\n value: String(f.value || \"\"),\n }))\n if (fieldsFormatados.length > 0) result.fields = fieldsFormatados\n }\n\n return result\n}\n","import { safeValidateSi9PropertySchema } from \"../../schemas/si9-property-schema.zod\"\nimport type { HorizonPropertySchemaBySi9Type } from \"../../schemas/horizon-property-schema-by-si9.zod\"\nimport { convertBaseFields } from \"./convertBaseFields\"\nimport { convertExtendedFields } from \"./convertExtendedFields\"\n\n/**\n * Converte um imóvel do formato SI9 para o formato Horizon Property\n *\n * Dividido em duas partes:\n * 1. Base Fields: campos que existem no horizon-property-schema-base\n * 2. Extended Fields: campos específicos do SI9 (não existem no schema base)\n */\nexport function convertSi9PropertyToHorizon(\n rawImovel: unknown,\n): HorizonPropertySchemaBySi9Type {\n // Validar entrada com Zod (safe parse)\n const validation = safeValidateSi9PropertySchema(rawImovel)\n\n if (!validation.success) {\n const errors = validation.error.issues\n .map((i) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\"; \")\n throw new Error(`Validação SI9 falhou: ${errors}`)\n }\n\n const imovel = validation.data\n\n // Converter campos base + estendidos\n const baseFields = convertBaseFields(imovel)\n const extendedFields = convertExtendedFields(imovel)\n\n // Combinar\n const result = {\n ...baseFields,\n ...extendedFields,\n }\n\n return result as HorizonPropertySchemaBySi9Type\n}\n\n// Re-exportar as funções individuais\nexport { convertBaseFields } from \"./convertBaseFields\"\nexport { convertExtendedFields } from \"./convertExtendedFields\"\n","import { promises as fs } from \"fs\"\nimport { join } from \"path\"\n\n// ========== TIPOS ==========\n\nexport interface SI9Credentials {\n\tusername: string\n\tpassword: string\n\tauthorization: string\n}\n\nexport interface PropertyDownloaderConfig {\n\tcredentials: SI9Credentials\n\toutputDir: string\n\tbaseUrl?: string\n}\n\nexport interface DownloadResult {\n\ttotalItems: number\n\tdownloadedItems: number\n\terrors: string[]\n}\n\ninterface TokenResponse {\n\taccess_token: string\n\trefresh_token: string\n\ttoken_type: string\n\texpires_in: number\n}\n\n// ========== CREDENCIAIS PADRÃO (conta Ghisi) ==========\n\nexport const SI9_DEFAULT_CREDENTIALS: SI9Credentials = {\n\tusername: \"ghisi-api\",\n\tpassword: \"y6HyTKxAZ40tx8D8w%5E3)\",\n\tauthorization: \"ZDc3ZmYyMzUtNmEyNS00YzE3LWI4NDktNjM3NWQ2NGM0ZTVhOmI2ZDhhMTgxLTQ5OWEtNGRjNi1hNGU0LTlkZTUxZjNjMDE5Nw==\",\n}\n\n// ========== DOWNLOADER ==========\n\nexport class PropertyDownloader {\n\tprivate credentials: SI9Credentials\n\tprivate baseUrl: string\n\tprivate outputDir: string\n\tprivate token: string | null = null\n\tprivate tokenExpiresAt: number = 0\n\n\tconstructor(config: PropertyDownloaderConfig) {\n\t\tthis.credentials = config.credentials\n\t\tthis.baseUrl = config.baseUrl || \"https://api.si9sistemas.com.br/imobilsi9-api\"\n\t\tthis.outputDir = config.outputDir\n\t}\n\n\t/**\n\t * Autentica via OAuth 2.0 Password Grant\n\t * IMPORTANTE: NÃO enviar Content-Type no auth (causa 500 na API)\n\t */\n\tprivate async authenticate(): Promise<TokenResponse> {\n\t\tconst url =\n\t\t\t`${this.baseUrl}/oauth/token?grant_type=password` +\n\t\t\t`&username=${this.credentials.username}` +\n\t\t\t`&password=${this.credentials.password}`\n\n\t\tconsole.log(`🔐 Autenticando na SI9...`)\n\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Basic ${this.credentials.authorization}`,\n\t\t\t},\n\t\t})\n\n\t\tif (!response.ok) {\n\t\t\tconst errorText = await response.text()\n\t\t\tthrow new Error(`Erro de autenticação ${response.status}: ${errorText}`)\n\t\t}\n\n\t\tconst data = (await response.json()) as TokenResponse\n\t\tconsole.log(`✅ Token obtido (expira em ${data.expires_in}s)`)\n\t\treturn data\n\t}\n\n\t/**\n\t * Garante que o token está válido, renovando se necessário\n\t * Margem de segurança: renova 60s antes de expirar\n\t */\n\tprivate async ensureToken(): Promise<void> {\n\t\tif (this.token && Date.now() < this.tokenExpiresAt) return\n\n\t\tconst auth = await this.authenticate()\n\t\tthis.token = auth.access_token\n\t\tthis.tokenExpiresAt = Date.now() + auth.expires_in * 1000 - 60000\n\t}\n\n\t/**\n\t * Busca todos os imóveis (SI9 não tem paginação)\n\t */\n\tprivate async getProperties(): Promise<any[]> {\n\t\tawait this.ensureToken()\n\n\t\tconst url = `${this.baseUrl}/property`\n\t\tconsole.log(`🔗 Requisição: GET ${url}`)\n\n\t\tconst response = await fetch(url, {\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Bearer ${this.token}`,\n\t\t\t},\n\t\t})\n\n\t\tif (!response.ok) {\n\t\t\tconst errorText = await response.text()\n\t\t\tthrow new Error(`Erro ${response.status}: ${errorText}`)\n\t\t}\n\n\t\treturn (await response.json()) as any[]\n\t}\n\n\tprivate async ensureOutputDir(): Promise<void> {\n\t\ttry {\n\t\t\tawait fs.access(this.outputDir)\n\t\t} catch {\n\t\t\tawait fs.mkdir(this.outputDir, { recursive: true })\n\t\t}\n\t}\n\n\t/**\n\t * Baixa TODOS os imóveis e salva em arquivo único\n\t * (SI9 não tem paginação — retorna tudo de uma vez)\n\t */\n\tasync downloadAll(): Promise<DownloadResult> {\n\t\tawait this.ensureOutputDir()\n\n\t\tconst errors: string[] = []\n\t\tlet downloadedItems = 0\n\n\t\tconsole.log(`🚀 Iniciando download completo da API SI9...`)\n\t\tconsole.log(`📁 Salvando em: ${this.outputDir}`)\n\n\t\ttry {\n\t\t\tconst properties = await this.getProperties()\n\n\t\t\tif (!Array.isArray(properties)) {\n\t\t\t\tthrow new Error(`Resposta inesperada: esperava array, recebeu ${typeof properties}`)\n\t\t\t}\n\n\t\t\tdownloadedItems = properties.length\n\t\t\tconsole.log(`📊 Recebidos: ${downloadedItems} imóveis`)\n\n\t\t\tif (downloadedItems > 0) {\n\t\t\t\tconst filePath = join(this.outputDir, \"all-properties.json\")\n\t\t\t\tawait fs.writeFile(filePath, JSON.stringify(properties, null, 2), \"utf8\")\n\t\t\t\tconsole.log(`✅ Salvo em: all-properties.json`)\n\t\t\t} else {\n\t\t\t\tconsole.log(`⚠️ Nenhum imóvel retornado (array vazio)`)\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconst errorMsg = `Erro no download: ${error instanceof Error ? error.message : String(error)}`\n\t\t\terrors.push(errorMsg)\n\t\t\tconsole.error(`❌ ${errorMsg}`)\n\t\t}\n\n\t\t// Resumo final\n\t\tconsole.log(`\\n📊 RESUMO DO DOWNLOAD:`)\n\t\tconsole.log(`✅ Propriedades baixadas: ${downloadedItems}`)\n\t\tif (errors.length > 0) {\n\t\t\tconsole.log(`❌ Erros: ${errors.length}`)\n\t\t\terrors.forEach((err) => console.log(` - ${err}`))\n\t\t}\n\n\t\treturn {\n\t\t\ttotalItems: downloadedItems,\n\t\t\tdownloadedItems,\n\t\t\terrors,\n\t\t}\n\t}\n}\n","/**\n * SI9 Extended Schema - v3.1.0\n *\n * Schema estendido do Horizon Base com campos específicos do SI9 CRM\n * Todas as keys em snake_case minúsculo (Regra 5)\n * Campos aninhados com prefixo do grupo (Regra 3)\n * Cada campo tem audit.source descrevendo a origem no CRM\n */\n\nimport type { EntitySchema } from \"@horizon-domains/property-model\";\nimport { horizonPropertySchemaBase } from \"@horizon-domains/property-model\";\n\n/**\n * Mapa de source para os 45 campos base do Horizon\n * Descreve de onde cada campo foi captado na API SI9\n */\nconst BASE_SOURCE_MAP: Record<string, string> = {\n\t// Sistema\n\tsource_published_at: \"(Vazio - não disponível na API)\",\n\tsource_updated_at: \"gerado com new Date().toISOString()\",\n\tcurrency: \"fixo 'BRL'\",\n\tunit_area: \"fixo 'm2'\",\n\tunit_distance: \"fixo 'meters'\",\n\n\t// Cabeçalho\n\treference: \"id (number→string)\",\n\ttitle: \"generalData.title\",\n\tdescription: \"generalData.description\",\n\n\t// SEO\n\tseo_slug: \"(Vazio - não disponível na API)\",\n\tseo_title: \"(Vazio - não disponível na API)\",\n\tseo_description: \"(Vazio - não disponível na API)\",\n\tseo_keywords: \"(Vazio - não disponível na API)\",\n\n\t// Mídia\n\tmain_image: \"images[0] (filtrar displaySite=true, primeira imagem)\",\n\timages: \"images[] (filtrar displaySite=true, excluir pic360)\",\n\tvideos: \"generalData.urlVideo (array com 1 item se existir)\",\n\tvirtual_tours: \"generalData.urlTour (array com 1 item se existir)\",\n\n\t// Ficha técnica\n\toperacao: \"destination.sale→'venda', destination.rent→'locacao', destination.season→'temporada' (array)\",\n\ttipo: \"generalData.category.name\",\n\tdormitorios: \"features.bedroom\",\n\tsuites: \"features.suite\",\n\tbanheiros: \"features.bathroom (só bathroom, toilet vai pra features_toilet separado)\",\n\tvagas_garagem: \"features.coveredGarage + features.outdoorGarage (soma cobertas + descobertas)\",\n\tarea_total: \"dimensions.totalArea (m²)\",\n\tarea_privativa: \"dimensions.privateArea (m²)\",\n\tarea_util: \"dimensions.usefulArea (m²)\",\n\tdestaque: \"website.highlight || website.superHighlight (true se qualquer um true)\",\n\n\t// Valores\n\tvalor_venda: \"values.saleValue (REAIS, só se destination.sale=true e > 0)\",\n\tvalor_locacao: \"values.rentValue (REAIS, só se destination.rent=true e > 0)\",\n\tvalor_condominio: \"values.condominiumFee (REAIS)\",\n\tvalor_iptu: \"values.iptuValue (REAIS, ANUAL)\",\n\n\t// Localização\n\tendereco_cep: \"location.zipCode (formatado 00000-000)\",\n\tendereco_estado: \"location.city.state\",\n\tendereco_cidade: \"location.city.name\",\n\tendereco_bairro: \"location.district.name\",\n\tendereco_logradouro: \"location.address\",\n\tendereco_numero: \"location.number\",\n\tendereco_complemento: \"location.complement\",\n\tendereco_referencia: \"location.referencePoint\",\n\tendereco_zona: \"(Vazio - não disponível na API)\",\n\tlat: \"location.latitude (string→number)\",\n\tlng: \"location.longitude (string→number)\",\n\n\t// Relações\n\tcorretor_key: \"(Vazio - não disponível na API)\",\n\tcorretor_nome: \"Campo personalizado 'Corretor' (se existir)\",\n\tcondominio_key: \"(Vazio - não disponível na API)\",\n\tcondominio_nome: \"generalData.allotment (nome do empreendimento/loteamento/edifício)\",\n};\n\nexport const HorizonPropertySchemaBySi9: EntitySchema = {\n\tentity: \"property\",\n\tversion: \"3.2.0\",\n\tdescription: \"Schema estendido SI9 CRM — 45 base com source tracking + extras snake_case\",\n\tfields: [\n\t\t// Injeta source nos campos base\n\t\t...horizonPropertySchemaBase.fields.map((field) => ({\n\t\t\t...field,\n\t\t\taudit: {\n\t\t\t\t...field.audit,\n\t\t\t\t...(BASE_SOURCE_MAP[field.key] ? { source: BASE_SOURCE_MAP[field.key] } : {}),\n\t\t\t},\n\t\t})),\n\n\t\t// ========================================\n\t\t// values.*\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"values_discount_value\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"currency\",\n\t\t\tunit: \"BRL\",\n\t\t\tcategories: [\"valores\"],\n\t\t\tui: { label: \"Valor de desconto\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"values.discountValue (REAIS)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"values_fci_value\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"currency\",\n\t\t\tunit: \"BRL\",\n\t\t\tcategories: [\"valores\"],\n\t\t\tui: { label: \"Valor FCI\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"values.fciValue (REAIS)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"values_assigned_value\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"currency\",\n\t\t\tunit: \"BRL\",\n\t\t\tcategories: [\"valores\"],\n\t\t\tui: { label: \"Valor atribuído\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"values.assignedValue (REAIS)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"values_trash_fee\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"currency\",\n\t\t\tunit: \"BRL\",\n\t\t\tcategories: [\"valores\"],\n\t\t\tui: { label: \"Taxa de lixo\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"values.trashFee (REAIS)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"values_disaster_fee\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"currency\",\n\t\t\tunit: \"BRL\",\n\t\t\tcategories: [\"valores\"],\n\t\t\tui: { label: \"Taxa de sinistro\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"values.disasterFee (REAIS)\" },\n\t\t},\n\n\t\t// ========================================\n\t\t// general_data.*\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"general_data_situation\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"situacoes\"],\n\t\t\tui: { label: \"Situação\" },\n\t\t\tenum: {\n\t\t\t\tSOLD: \"Vendido\",\n\t\t\t\tRENTED: \"Alugado\",\n\t\t\t\tRESERVED: \"Reservado\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"si9:property\",\n\t\t\t\tsource:\n\t\t\t\t\t\"generalData.situation (enum: AVALIABLE, INACTIVE, RENTED, RESERVED, SOLD, INVOICE, TODOCUMENT, DELETE, TERMINATION, RENOVATION)\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"general_data_board\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"comercial\"],\n\t\t\tui: { label: \"Placa\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"generalData.board\" },\n\t\t},\n\n\t\t// ========================================\n\t\t// website.*\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"website_super_highlight\",\n\t\t\ttype: \"Boolean\",\n\t\t\tcategories: [\"comercial\"],\n\t\t\tui: { label: \"Super destaque\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"website.superHighlight\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"website_show_in_core\",\n\t\t\ttype: \"Boolean\",\n\t\t\tcategories: [\"comercial\"],\n\t\t\tui: { label: \"Mostrar no portal\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"website.showInCore\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"website_mcmv\",\n\t\t\ttype: \"Boolean\",\n\t\t\tcategories: [\"comercial\"],\n\t\t\tui: { label: \"Minha Casa Minha Vida\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"website.mcmv\" },\n\t\t},\n\n\t\t// ========================================\n\t\t// destination.*\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"destination_exchange\",\n\t\t\ttype: \"Boolean\",\n\t\t\tcategories: [\"comercial\"],\n\t\t\tui: { label: \"Aceita permuta\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"destination.exchange\" },\n\t\t},\n\n\t\t// ========================================\n\t\t// location.* (complementar)\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"location_apartment\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"endereco\"],\n\t\t\tui: { label: \"Apartamento\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"location.apartment\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"location_block\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"endereco\"],\n\t\t\tui: { label: \"Bloco\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"location.block\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"location_floor\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"endereco\"],\n\t\t\tui: { label: \"Andar\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"location.floor (string: '1', '10', 'Terreo')\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"location_quatrain\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"endereco\"],\n\t\t\tui: { label: \"Quadra\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"location.quatrain\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"location_lot\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"endereco\"],\n\t\t\tui: { label: \"Lote\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"location.lot\" },\n\t\t},\n\n\t\t// ========================================\n\t\t// dimensions.*\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"dimensions_building_area\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"area\",\n\t\t\tunit: \"m2\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Área construída\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.buildingArea (m²)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"dimensions_land_area\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"area\",\n\t\t\tunit: \"m2\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Área do terreno\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.landArea (m²)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"dimensions_internal_area\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"area\",\n\t\t\tunit: \"m2\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Área interna\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.internalArea (m²)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"dimensions_registered_area\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"area\",\n\t\t\tunit: \"m2\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Área registrada\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.registeredArea (m²)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"dimensions_common_area\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"area\",\n\t\t\tunit: \"m2\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Área comum\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.commonArea (m²)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"dimensions_garage_area\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"area\",\n\t\t\tunit: \"m2\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Área da garagem\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.garageArea (m²)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"dimensions_front_size\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"distance\",\n\t\t\tunit: \"m\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Frente do terreno\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.frontSize (metros)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"dimensions_funds_size\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"distance\",\n\t\t\tunit: \"m\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Fundos do terreno\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.fundsSize (metros)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"dimensions_left_size\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"distance\",\n\t\t\tunit: \"m\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Lateral esquerda\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.leftSize (metros)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"dimensions_right_size\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"distance\",\n\t\t\tunit: \"m\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Lateral direita\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.rightSize (metros)\" },\n\t\t},\n\n\t\t// ========================================\n\t\t// features (booleans → array) + features.* (numbers/strings)\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"features\",\n\t\t\ttype: \"String[]\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tdb: { type: \"jsonb\", index: \"gin\" },\n\t\t\tui: { label: \"Características\" },\n\t\t\taudit: {\n\t\t\t\torigin: \"si9:property\",\n\t\t\t\tsource: \"features booleans true → labels PT-BR via FEATURES_LABELS (27 booleans)\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"features_room\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tui: { label: \"Salas\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.room\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_kitchen\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tui: { label: \"Cozinhas\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.kitchen\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_closet\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tui: { label: \"Closets\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.closet\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_balcony\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tui: { label: \"Sacadas\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.balcony\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_ar_condicionado\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tui: { label: \"Ar condicionado\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.arCondicionado (quantidade)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_toilet\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tui: { label: \"Lavabos\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.toilet (separado de banheiros)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_floor\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"estrutura\"],\n\t\t\tui: { label: \"Tipo de piso\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.floor (ex: Porcelanato, Madeira)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_roof\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"estrutura\"],\n\t\t\tui: { label: \"Tipo de telhado\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.roof (ex: Cerâmico, Laje)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_ceiling\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"estrutura\"],\n\t\t\tui: { label: \"Tipo de forro\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.ceiling (ex: Gesso, PVC, Laje)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_paving\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"estrutura\"],\n\t\t\tui: { label: \"Pavimentação interna\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.paving (string livre, dados inconsistentes)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_pavement\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"estrutura\"],\n\t\t\tui: { label: \"Tipo de calçamento\" },\n\t\t\tenum: { COBBLESTONE: \"Paralelepípedo\", ASPHALT: \"Asfalto\", GRAVEL: \"Cascalho\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.pavement (enum: COBBLESTONE, ASPHALT, GRAVEL)\" },\n\t\t},\n\n\t\t// ========================================\n\t\t// security (booleans → array)\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"security\",\n\t\t\ttype: \"String[]\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tdb: { type: \"jsonb\", index: \"gin\" },\n\t\t\tui: { label: \"Segurança\" },\n\t\t\taudit: {\n\t\t\t\torigin: \"si9:property\",\n\t\t\t\tsource: \"security booleans true → labels PT-BR via SECURITY_LABELS (8 booleans)\",\n\t\t\t},\n\t\t},\n\n\t\t// ========================================\n\t\t// recreation (booleans → array) + recreation.* (enums)\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"recreation\",\n\t\t\ttype: \"String[]\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tdb: { type: \"jsonb\", index: \"gin\" },\n\t\t\tui: { label: \"Lazer\" },\n\t\t\taudit: {\n\t\t\t\torigin: \"si9:property\",\n\t\t\t\tsource: \"recreation booleans true → labels PT-BR via RECREATION_LABELS (9 booleans)\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"recreation_heating\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"estrutura\"],\n\t\t\tui: { label: \"Aquecimento\" },\n\t\t\tenum: { GAS: \"Gás\", SOLAR: \"Solar\", ELETRIC: \"Elétrico\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"recreation.heating (enum: GAS, SOLAR, ELETRIC)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"recreation_position_sun\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"estrutura\"],\n\t\t\tui: { label: \"Posição solar\" },\n\t\t\tenum: { NORTH: \"Norte\", SOUTH: \"Sul\", EAST: \"Leste\", WEST: \"Oeste\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"recreation.positionSun (enum: NORTH, SOUTH, EAST, WEST)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"recreation_position_court\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"estrutura\"],\n\t\t\tui: { label: \"Posição na quadra\" },\n\t\t\tenum: { MIDDLE_COURT: \"Meio de quadra\", CORNER: \"Esquina\", SUB_CORNER: \"Sub-esquina\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"recreation.positionCourt (enum: MIDDLE_COURT, CORNER, SUB_CORNER)\" },\n\t\t},\n\n\t\t// ========================================\n\t\t// rural (booleans → array) + rural.* (numbers/strings)\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"rural\",\n\t\t\ttype: \"String[]\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tdb: { type: \"jsonb\", index: \"gin\" },\n\t\t\tui: { label: \"Características rurais\" },\n\t\t\taudit: {\n\t\t\t\torigin: \"si9:property\",\n\t\t\t\tsource: \"rural booleans true → labels PT-BR via RURAL_LABELS (4 booleans: river, mine, hose, footballField)\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_bushels\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Sacas\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.bushels (capacidade produtiva)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_acre\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Alqueires\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.acre\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_pasture\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Pastagem\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.pasture (ex: formado, degradado)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_mechanized\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Mecanizada\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.mechanized (ex: total, parcial)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_reserve\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Reserva\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.reserve (hectares)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_pigsty\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Pocilgas\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.pigsty\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_aviary\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Aviários\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.aviary\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_weir\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Açudes\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.weir\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_wood_house\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Casas de madeira\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.woodHouse\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_brick_house\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Casas de alvenaria\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.brickHouse\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_mixed_house\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Casas mistas\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.mixedHouse\" },\n\t\t},\n\n\t\t// ========================================\n\t\t// fields (campos extras)\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"fields\",\n\t\t\ttype: \"Json\",\n\t\t\tcategories: [\"dados-extras\"],\n\t\t\tdb: { type: \"jsonb\" },\n\t\t\tui: { label: \"Campos extras\" },\n\t\t\taudit: {\n\t\t\t\torigin: \"si9:property\",\n\t\t\t\tsource: \"fields[] ({field, value} — campos personalizados criados pela imobiliária)\",\n\t\t\t},\n\t\t},\n\t],\n};\n\nexport default HorizonPropertySchemaBySi9;\n","import { z } from \"zod\"\nimport { HorizonPropertySchemaBaseZod } from \"@horizon-domains/property-model\"\n\n// ========================================\n// SCHEMAS DE MÍDIA (override para opcional)\n// ========================================\nconst ImageSchema = z\n .object({\n md: z.string().optional(),\n sm: z.string().optional(),\n full: z.string().optional(),\n cover: z.boolean().optional(),\n })\n .passthrough()\n\nconst VideoSchema = z\n .object({\n url: z.string().optional(),\n embed_url: z.string().optional(),\n })\n .passthrough()\n\nconst VirtualTourSchema = z\n .object({\n embed_url: z.string().optional(),\n })\n .passthrough()\n\nconst MainImageSchema = z\n .object({\n md: z.string().optional(),\n sm: z.string().optional(),\n full: z.string().optional(),\n })\n .passthrough()\n\n// ========================================\n// Schema Horizon para SI9 CRM\n// Todas as keys em snake_case minúsculo\n// Campos aninhados com prefixo do grupo (Regra 3+5)\n// ========================================\n\nexport const HorizonPropertySchemaBySi9Zod = HorizonPropertySchemaBaseZod\n .omit({ images: true, videos: true, virtual_tours: true, main_image: true })\n .extend({\n // Mídia (override mais flexível)\n images: z.array(ImageSchema).optional(),\n videos: z.array(VideoSchema).optional(),\n virtual_tours: z.array(VirtualTourSchema).optional(),\n main_image: MainImageSchema.optional(),\n\n // ========================================\n // SI9 EXTRAS — values.*\n // ========================================\n values_discount_value: z.number().min(0).optional(),\n values_fci_value: z.number().min(0).optional(),\n values_assigned_value: z.number().min(0).optional(),\n values_trash_fee: z.number().min(0).optional(),\n values_disaster_fee: z.number().min(0).optional(),\n\n // ========================================\n // SI9 EXTRAS — general_data.*\n // ========================================\n general_data_situation: z.string().optional(),\n general_data_board: z.string().optional(),\n general_data_allotment: z.string().optional(),\n\n // ========================================\n // SI9 EXTRAS — website.*\n // ========================================\n website_super_highlight: z.boolean().optional(),\n website_show_in_core: z.boolean().optional(),\n website_mcmv: z.boolean().optional(),\n\n // ========================================\n // SI9 EXTRAS — destination.*\n // ========================================\n destination_exchange: z.boolean().optional(),\n\n // ========================================\n // SI9 EXTRAS — location.* (complementar)\n // ========================================\n location_apartment: z.string().optional(),\n location_block: z.string().optional(),\n location_floor: z.string().optional(),\n location_quatrain: z.string().optional(),\n location_lot: z.string().optional(),\n\n // ========================================\n // SI9 EXTRAS — dimensions.*\n // ========================================\n dimensions_building_area: z.number().min(0).optional(),\n dimensions_land_area: z.number().min(0).optional(),\n dimensions_internal_area: z.number().min(0).optional(),\n dimensions_registered_area: z.number().min(0).optional(),\n dimensions_common_area: z.number().min(0).optional(),\n dimensions_garage_area: z.number().min(0).optional(),\n dimensions_front_size: z.number().min(0).optional(),\n dimensions_funds_size: z.number().min(0).optional(),\n dimensions_left_size: z.number().min(0).optional(),\n dimensions_right_size: z.number().min(0).optional(),\n\n // ========================================\n // SI9 EXTRAS — features (booleans → array)\n // ========================================\n features: z.array(z.string()).optional(),\n\n // ========================================\n // SI9 EXTRAS — features.* (numbers/strings)\n // ========================================\n features_room: z.number().optional(),\n features_kitchen: z.number().optional(),\n features_closet: z.number().optional(),\n features_balcony: z.number().optional(),\n features_ar_condicionado: z.number().optional(),\n features_toilet: z.number().optional(),\n features_floor: z.string().optional(),\n features_roof: z.string().optional(),\n features_ceiling: z.string().optional(),\n features_paving: z.string().optional(),\n features_pavement: z.string().optional(),\n\n // ========================================\n // SI9 EXTRAS — security (booleans → array)\n // ========================================\n security: z.array(z.string()).optional(),\n\n // ========================================\n // SI9 EXTRAS — recreation (booleans → array)\n // ========================================\n recreation: z.array(z.string()).optional(),\n\n // ========================================\n // SI9 EXTRAS — recreation.* (strings/enums)\n // ========================================\n recreation_heating: z.string().optional(),\n recreation_position_sun: z.string().optional(),\n recreation_position_court: z.string().optional(),\n\n // ========================================\n // SI9 EXTRAS — rural (booleans → array)\n // ========================================\n rural: z.array(z.string()).optional(),\n\n // ========================================\n // SI9 EXTRAS — rural.* (numbers/strings)\n // ========================================\n rural_bushels: z.number().optional(),\n rural_acre: z.number().optional(),\n rural_pasture: z.string().optional(),\n rural_mechanized: z.string().optional(),\n rural_reserve: z.number().optional(),\n rural_pigsty: z.number().optional(),\n rural_aviary: z.number().optional(),\n rural_weir: z.number().optional(),\n rural_wood_house: z.number().optional(),\n rural_brick_house: z.number().optional(),\n rural_mixed_house: z.number().optional(),\n\n // ========================================\n // SI9 EXTRAS — fields (campos extras)\n // ========================================\n fields: z\n .array(\n z.object({\n field: z.string(),\n value: z.string(),\n }),\n )\n .optional(),\n\n })\n .passthrough()\n\n// Tipo inferido\nexport type HorizonPropertySchemaBySi9Type = z.infer<\n typeof HorizonPropertySchemaBySi9Zod\n>\n\n// Helper de validação\nexport const validateHorizonPropertySchemaBySi9 = (\n data: unknown,\n): HorizonPropertySchemaBySi9Type => {\n return HorizonPropertySchemaBySi9Zod.parse(data)\n}\n\n// Helper de validação safe\nexport const safeValidateHorizonPropertySchemaBySi9 = (data: unknown) => {\n return HorizonPropertySchemaBySi9Zod.safeParse(data)\n}\n\n// Helper de validação parcial\nexport const validatePartialHorizonPropertySchemaBySi9 = (data: unknown) => {\n return HorizonPropertySchemaBySi9Zod.partial().parse(data)\n}\n"],"mappings":"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","names":["fs","import_zod","import_property_model"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/schemas/si9-property-schema.zod.ts","../src/services/PropertyConverter/convertBaseFields.ts","../src/helpers/si9-labels.ts","../src/services/PropertyConverter/convertExtendedFields.ts","../src/services/PropertyConverter/index.ts","../src/services/PropertyDownloader.ts","../src/schemas/horizon-property-schema-by-si9.ts","../src/schemas/horizon-property-schema-by-si9.zod.ts"],"sourcesContent":["// Exportar função principal de conversão\nexport { convertSi9PropertyToHorizon } from \"./services/PropertyConverter\"\n\n// Exportar funções individuais do converter\nexport {\n convertBaseFields,\n convertExtendedFields,\n} from \"./services/PropertyConverter\"\n\n// Exportar serviços reutilizáveis\nexport { PropertyDownloader } from \"./services/PropertyDownloader\"\nexport type {\n SI9Credentials,\n PropertyDownloaderConfig,\n DownloadResult,\n} from \"./services/PropertyDownloader\"\nexport { SI9_DEFAULT_CREDENTIALS } from \"./services/PropertyDownloader\"\n\n// Exportar schemas TypeScript (Entity Schema)\nexport { HorizonPropertySchemaBySi9 } from \"./schemas/horizon-property-schema-by-si9\"\n\n// Exportar schema Zod de entrada (SI9)\nexport {\n Si9PropertySchemaZod,\n validateSi9PropertySchema,\n safeValidateSi9PropertySchema,\n type Si9PropertySchema,\n} from \"./schemas/si9-property-schema.zod\"\n\n// Exportar schema Zod de saída (Horizon)\nexport {\n HorizonPropertySchemaBySi9Zod,\n validateHorizonPropertySchemaBySi9,\n safeValidateHorizonPropertySchemaBySi9,\n type HorizonPropertySchemaBySi9Type,\n} from \"./schemas/horizon-property-schema-by-si9.zod\"\n\n// Exportar helpers\nexport {\n FEATURES_LABELS,\n SECURITY_LABELS,\n RECREATION_LABELS,\n RURAL_LABELS,\n booleanFieldsToLabels,\n} from \"./helpers/si9-labels\"\n","import { z } from \"zod\"\n\n// ========================================\n// Sub-schemas SI9\n// ========================================\n\nconst categorySchema = z\n .object({\n id: z.number().nullish(),\n name: z.string().nullish(),\n })\n .passthrough()\n\nconst generalDataSchema = z\n .object({\n board: z.string().nullish(),\n situation: z.string().nullish(),\n category: categorySchema.nullish(),\n description: z.string().nullish(),\n title: z.string().nullish(),\n allotment: z.string().nullish(),\n costCenter: z.string().nullish(),\n urlVideo: z.string().nullish(),\n urlTour: z.string().nullish(),\n })\n .passthrough()\n\nconst destinationSchema = z\n .object({\n sale: z.boolean().nullish(),\n rent: z.boolean().nullish(),\n season: z.boolean().nullish(),\n private: z.boolean().nullish(),\n application: z.boolean().nullish(),\n exchange: z.boolean().nullish(),\n })\n .passthrough()\n\nconst valuesSchema = z\n .object({\n saleValue: z.number().nullish(),\n rentValue: z.number().nullish(),\n discountValue: z.number().nullish(),\n fciValue: z.number().nullish(),\n iptuValue: z.number().nullish(),\n assignedValue: z.number().nullish(),\n trashFee: z.number().nullish(),\n disasterFee: z.number().nullish(),\n condominiumFee: z.number().nullish(),\n })\n .passthrough()\n\nconst citySchema = z\n .object({\n id: z.union([z.number(), z.null()]).nullish(),\n name: z.string().nullish(),\n state: z.string().nullish(),\n })\n .passthrough()\n\nconst districtSchema = z\n .object({\n id: z.union([z.number(), z.null()]).nullish(),\n name: z.string().nullish(),\n })\n .passthrough()\n\nconst locationSchema = z\n .object({\n city: citySchema.nullish(),\n address: z.string().nullish(),\n number: z.string().nullish(),\n zipCode: z.string().nullish(),\n district: districtSchema.nullish(),\n apartment: z.string().nullish(),\n block: z.string().nullish(),\n floor: z.string().nullish(),\n quatrain: z.string().nullish(),\n lot: z.string().nullish(),\n complement: z.string().nullish(),\n referencePoint: z.string().nullish(),\n longitude: z.string().nullish(),\n latitude: z.string().nullish(),\n blocksMap: z.unknown().nullish(),\n })\n .passthrough()\n\nconst websiteSchema = z\n .object({\n highlight: z.boolean().nullish(),\n superHighlight: z.boolean().nullish(),\n showInCore: z.boolean().nullish(),\n mcmv: z.boolean().nullish(),\n })\n .passthrough()\n\nconst dimensionsSchema = z\n .object({\n buildingArea: z.number().nullish(),\n landArea: z.number().nullish(),\n usefulArea: z.number().nullish(),\n privateArea: z.number().nullish(),\n internalArea: z.number().nullish(),\n registeredArea: z.number().nullish(),\n totalArea: z.number().nullish(),\n commonArea: z.number().nullish(),\n garageArea: z.number().nullish(),\n frontSize: z.number().nullish(),\n fundsSize: z.number().nullish(),\n leftSize: z.number().nullish(),\n rightSize: z.number().nullish(),\n })\n .passthrough()\n\nconst featuresSchema = z\n .object({\n // Numéricos\n room: z.number().nullish(),\n kitchen: z.number().nullish(),\n bedroom: z.number().nullish(),\n suite: z.number().nullish(),\n closet: z.number().nullish(),\n bathroom: z.number().nullish(),\n toilet: z.number().nullish(),\n balcony: z.number().nullish(),\n coveredGarage: z.number().nullish(),\n outdoorGarage: z.number().nullish(),\n arCondicionado: z.number().nullish(),\n\n // Acabamentos (string/enum)\n floor: z.string().nullish(),\n roof: z.string().nullish(),\n ceiling: z.string().nullish(),\n paving: z.string().nullish(),\n pavement: z.string().nullish(),\n\n // Booleans\n shed: z.boolean().nullish(),\n needMaid: z.boolean().nullish(),\n serviceArea: z.boolean().nullish(),\n pantry: z.boolean().nullish(),\n furnished: z.boolean().nullish(),\n semiFurnished: z.boolean().nullish(),\n wineHouse: z.boolean().nullish(),\n fittedKitchen: z.boolean().nullish(),\n kennel: z.boolean().nullish(),\n waterTank: z.boolean().nullish(),\n barbecueGrill: z.boolean().nullish(),\n telephone: z.boolean().nullish(),\n porchWithGrill: z.boolean().nullish(),\n elevator: z.boolean().nullish(),\n porch: z.boolean().nullish(),\n winterGarden: z.boolean().nullish(),\n penthouseApartment: z.boolean().nullish(),\n highStandard: z.boolean().nullish(),\n release: z.boolean().nullish(),\n condominium: z.boolean().nullish(),\n inPlant: z.boolean().nullish(),\n coast: z.boolean().nullish(),\n serviceBathroom: z.boolean().nullish(),\n lounge: z.boolean().nullish(),\n onlineConcierge: z.boolean().nullish(),\n demiSuite: z.boolean().nullish(),\n newOrSemiNew: z.boolean().nullish(),\n })\n .passthrough()\n\nconst securitySchema = z\n .object({\n alarm: z.boolean().nullish(),\n electricFence: z.boolean().nullish(),\n intercom: z.boolean().nullish(),\n concierge: z.boolean().nullish(),\n walled: z.boolean().nullish(),\n gate: z.boolean().nullish(),\n electronicGate: z.boolean().nullish(),\n protectionGrid: z.boolean().nullish(),\n })\n .passthrough()\n\nconst recreationSchema = z\n .object({\n playgroud: z.boolean().nullish(), // typo da SI9 (sem \"n\")\n sauna: z.boolean().nullish(),\n pool: z.boolean().nullish(),\n gym: z.boolean().nullish(),\n fireplace: z.boolean().nullish(),\n gourmetSpace: z.boolean().nullish(),\n multisportCourt: z.boolean().nullish(),\n partyRoom: z.boolean().nullish(),\n whirlpool: z.boolean().nullish(),\n heating: z.string().nullish(),\n positionSun: z.string().nullish(),\n positionCourt: z.string().nullish(),\n })\n .passthrough()\n\nconst ruralSchema = z\n .object({\n river: z.boolean().nullish(),\n mine: z.boolean().nullish(),\n hose: z.boolean().nullish(),\n footballField: z.boolean().nullish(),\n bushels: z.number().nullish(),\n acre: z.number().nullish(),\n pasture: z.string().nullish(),\n mechanized: z.string().nullish(),\n reserve: z.number().nullish(),\n pigsty: z.number().nullish(),\n aviary: z.number().nullish(),\n weir: z.number().nullish(),\n woodHouse: z.number().nullish(),\n brickHouse: z.number().nullish(),\n mixedHouse: z.number().nullish(),\n })\n .passthrough()\n\nconst companySchema = z\n .object({\n id: z.number().nullish(),\n fancyName: z.string().nullish(),\n corporateName: z.string().nullish(),\n address: z.string().nullish(),\n phoneNumber: z.string().nullish(),\n siteUrl: z.string().nullish(),\n })\n .passthrough()\n\nconst imageSchema = z\n .object({\n url: z.string().nullish(),\n subtitle: z.string().nullish(),\n displaySite: z.boolean().nullish(),\n pic360: z.union([z.boolean(), z.string()]).nullish(),\n })\n .passthrough()\n\nconst fieldSchema = z\n .object({\n field: z.string().nullish(),\n value: z.unknown().nullish(),\n })\n .passthrough()\n\n// ========================================\n// Schema principal SI9\n// ========================================\n\nconst brokerSchema = z\n .object({\n id: z.number().nullish(),\n name: z.string().nullish(),\n cellphone: z.string().nullish(),\n photoUrl: z.string().nullish(),\n creci: z.string().nullish(),\n })\n .passthrough()\n\nexport const Si9PropertySchemaZod = z\n .object({\n id: z.number(),\n generalData: generalDataSchema.nullish(),\n destination: destinationSchema.nullish(),\n values: valuesSchema.nullish(),\n location: locationSchema.nullish(),\n website: websiteSchema.nullish(),\n dimensions: dimensionsSchema.nullish(),\n features: featuresSchema.nullish(),\n security: securitySchema.nullish(),\n recreation: recreationSchema.nullish(),\n rural: ruralSchema.nullish(),\n company: companySchema.nullish(),\n broker: brokerSchema.nullish(),\n images: z.array(imageSchema).nullish(),\n fields: z.array(fieldSchema).nullish(),\n })\n .passthrough()\n\n// Tipo inferido\nexport type Si9PropertySchema = z.infer<typeof Si9PropertySchemaZod>\n\n// Helper de validação\nexport const validateSi9PropertySchema = (data: unknown): Si9PropertySchema => {\n return Si9PropertySchemaZod.parse(data)\n}\n\n// Helper de validação safe\nexport const safeValidateSi9PropertySchema = (data: unknown) => {\n return Si9PropertySchemaZod.safeParse(data)\n}\n","import type { Si9PropertySchema } from \"../../schemas/si9-property-schema.zod\"\nimport type { HorizonPropertySchemaBySi9Type } from \"../../schemas/horizon-property-schema-by-si9.zod\"\n\n/**\n * Mapa de chaves reconhecidas nos fields customizados\n * Nomes em português legível (aparecem nos portais)\n */\nconst FIELDS_RECONHECIDOS: Record<\n string,\n (result: Partial<HorizonPropertySchemaBySi9Type>, value: string) => void\n> = {\n \"Geolocalização aproximada\": (result, _value) => {\n // geo_aproximado é objeto { lat, lng } — só pode ser preenchido se já tiver lat/lng\n // Será tratado após o processamento de coordenadas\n },\n}\n\n/**\n * Converte campos do schema base Horizon (campos padrão que existem em todos os property models)\n * Conforme PLANO_CONVERSOR.md\n */\nexport function convertBaseFields(\n imovel: Si9PropertySchema,\n): Partial<HorizonPropertySchemaBySi9Type> {\n const result: Partial<HorizonPropertySchemaBySi9Type> = {}\n\n // ========== IDENTIFICAÇÃO BÁSICA ==========\n result.reference = String(imovel.id)\n result.title = imovel.generalData?.title || \"Sem título\"\n result.description = imovel.generalData?.description || \"Sem descrição\"\n\n // SI9 não tem campo de data de atualização — usar data da sincronização\n result.source_updated_at = new Date().toISOString()\n\n // source_published_at: deixar vazio (CRM tem dtCadastro mas API não expõe)\n\n // ========== CONFIGURAÇÕES ==========\n result.currency = \"BRL\"\n result.unit_area = \"m2\"\n result.unit_distance = \"meters\"\n\n // ========== OPERAÇÃO ==========\n const dest = imovel.destination\n if (dest) {\n const operacao: (\"venda\" | \"locacao\" | \"temporada\")[] = []\n if (dest.sale) operacao.push(\"venda\")\n if (dest.rent) operacao.push(\"locacao\")\n if (dest.season) operacao.push(\"temporada\")\n if (operacao.length > 0) result.operacao = operacao\n }\n\n // ========== TIPO ==========\n if (imovel.generalData?.category?.name) {\n result.tipo = imovel.generalData.category.name\n }\n\n // ========== VALORES MONETÁRIOS ==========\n // Valores em REAIS (R$) — NÃO dividir por 100\n const values = imovel.values\n if (values) {\n if (values.saleValue && values.saleValue > 0 && imovel.destination?.sale) {\n result.valor_venda = values.saleValue\n }\n if (values.rentValue && values.rentValue > 0 && imovel.destination?.rent) {\n result.valor_locacao = values.rentValue\n }\n if (values.condominiumFee && values.condominiumFee > 0) {\n result.valor_condominio = values.condominiumFee\n }\n if (values.iptuValue && values.iptuValue > 0) {\n result.valor_iptu = values.iptuValue\n }\n }\n\n // ========== ÁREAS ==========\n const dim = imovel.dimensions\n if (dim) {\n if (dim.totalArea && dim.totalArea > 0) result.area_total = dim.totalArea\n if (dim.privateArea && dim.privateArea > 0)\n result.area_privativa = dim.privateArea\n if (dim.usefulArea && dim.usefulArea > 0) result.area_util = dim.usefulArea\n }\n\n // ========== DEPENDÊNCIAS (features numéricos) ==========\n const feat = imovel.features\n if (feat) {\n if (feat.bedroom && feat.bedroom > 0) result.dormitorios = feat.bedroom\n if (feat.suite && feat.suite > 0) result.suites = feat.suite\n\n // Banheiros = só bathroom (toilet/lavabo vai como campo extra separado)\n if (feat.bathroom && feat.bathroom > 0) result.banheiros = feat.bathroom\n\n // Garagens = coveredGarage + outdoorGarage\n const covered = feat.coveredGarage || 0\n const outdoor = feat.outdoorGarage || 0\n const totalGaragens = covered + outdoor\n if (totalGaragens > 0) result.vagas_garagem = totalGaragens\n }\n\n // ========== ENDEREÇO ==========\n const loc = imovel.location\n if (loc) {\n // CEP: formatar 00000-000\n if (loc.zipCode) {\n const cepLimpo = loc.zipCode.replace(/\\D/g, \"\")\n if (cepLimpo.length === 8) {\n result.endereco_cep = `${cepLimpo.slice(0, 5)}-${cepLimpo.slice(5)}`\n } else {\n result.endereco_cep = loc.zipCode\n }\n }\n\n if (loc.city?.state) result.endereco_estado = loc.city.state\n if (loc.city?.name) result.endereco_cidade = loc.city.name\n if (loc.district?.name) result.endereco_bairro = loc.district.name\n if (loc.address) result.endereco_logradouro = loc.address\n if (loc.number) result.endereco_numero = loc.number\n if (loc.complement) result.endereco_complemento = loc.complement\n if (loc.referencePoint) result.endereco_referencia = loc.referencePoint\n\n // Coordenadas (vem como string, converter para number)\n if (loc.latitude && loc.longitude) {\n const lat = Number(loc.latitude)\n const lng = Number(loc.longitude)\n if (!isNaN(lat) && !isNaN(lng) && lat !== 0 && lng !== 0) {\n result.lat = lat\n result.lng = lng\n }\n }\n }\n\n // ========== CORRETOR (broker nativo da API) ==========\n if (imovel.broker?.id) {\n result.corretor_key = String(imovel.broker.id)\n }\n if (imovel.broker?.name) {\n result.corretor_nome = imovel.broker.name\n }\n\n // ========== CONDOMÍNIO ==========\n if (imovel.generalData?.allotment) {\n result.condominio_nome = imovel.generalData.allotment\n }\n\n // ========== DESTAQUE ==========\n if (imovel.website?.highlight || imovel.website?.superHighlight) {\n result.destaque = true\n }\n\n // ========== IMAGENS ==========\n if (imovel.images && imovel.images.length > 0) {\n // Filtrar apenas imagens com displaySite=true (ou sem a flag)\n const visibleImages = imovel.images.filter(\n (img) => img.displaySite !== false && img.url,\n )\n\n result.images = visibleImages.map((img, index) => ({\n full: img.url || \"\",\n md: img.url || \"\",\n sm: img.url || \"\",\n cover: index === 0,\n }))\n\n // Main image = primeira imagem\n if (visibleImages.length > 0 && visibleImages[0].url) {\n result.main_image = {\n full: visibleImages[0].url,\n md: visibleImages[0].url,\n sm: visibleImages[0].url,\n }\n }\n } else {\n result.images = []\n }\n\n // ========== VÍDEOS ==========\n if (imovel.generalData?.urlVideo) {\n const url = imovel.generalData.urlVideo\n result.videos = [\n {\n url,\n embed_url: url,\n },\n ]\n } else {\n result.videos = []\n }\n\n // ========== TOURS VIRTUAIS ==========\n if (imovel.generalData?.urlTour) {\n result.virtual_tours = [\n {\n embed_url: imovel.generalData.urlTour,\n },\n ]\n } else {\n result.virtual_tours = []\n }\n\n // ========== SEO ==========\n // Não fabricar fallbacks — se o CRM não tem SEO nativo, fica vazio\n // O front-end resolve na hora de renderizar\n\n // ========== FIELDS → chaves reconhecidas ==========\n const fields = imovel.fields\n if (fields && fields.length > 0) {\n // Chaves reconhecidas: copiar pra campos Horizon\n for (const f of fields) {\n if (!f.field) continue\n const handler = FIELDS_RECONHECIDOS[String(f.field)]\n if (handler) {\n handler(result, String(f.value || \"\"))\n }\n }\n\n // geo_aproximado: se \"Geolocalização aproximada\" existe E temos lat/lng\n const hasGeoField = fields.some(\n (f) => String(f.field) === \"Geolocalização aproximada\",\n )\n if (hasGeoField && result.lat && result.lng) {\n result.geo_aproximado = {\n lat: result.lat,\n lng: result.lng,\n }\n }\n }\n\n return result\n}\n","/**\n * Mapas de tradução boolean → label PT-BR para campos da SI9\n * Converte campos booleanos `true` em arrays de strings descritivas\n */\n\n// ========================================\n// Features (características do imóvel)\n// ========================================\nexport const FEATURES_LABELS: Record<string, string> = {\n shed: \"Galpão\",\n needMaid: \"Dependência de empregada\",\n serviceArea: \"Área de serviço\",\n pantry: \"Despensa\",\n furnished: \"Mobiliado\",\n semiFurnished: \"Semi-mobiliado\",\n wineHouse: \"Adega\",\n fittedKitchen: \"Cozinha planejada\",\n kennel: \"Canil\",\n waterTank: \"Cisterna\",\n barbecueGrill: \"Churrasqueira\",\n telephone: \"Telefone\",\n porchWithGrill: \"Varanda gourmet\",\n elevator: \"Elevador\",\n porch: \"Varanda\",\n winterGarden: \"Jardim de inverno\",\n penthouseApartment: \"Cobertura\",\n highStandard: \"Alto padrão\",\n release: \"Lançamento\",\n condominium: \"Condomínio\",\n inPlant: \"Na planta\",\n coast: \"Litoral\",\n serviceBathroom: \"Banheiro de serviço\",\n lounge: \"Sala de estar\",\n onlineConcierge: \"Portaria online\",\n demiSuite: \"Demi-suíte\",\n newOrSemiNew: \"Novo ou seminovo\",\n}\n\n// ========================================\n// Security (segurança)\n// ========================================\nexport const SECURITY_LABELS: Record<string, string> = {\n alarm: \"Alarme\",\n electricFence: \"Cerca elétrica\",\n intercom: \"Interfone\",\n concierge: \"Portaria\",\n walled: \"Murado\",\n gate: \"Portão\",\n electronicGate: \"Portão eletrônico\",\n protectionGrid: \"Grade de proteção\",\n}\n\n// ========================================\n// Recreation (lazer)\n// ========================================\nexport const RECREATION_LABELS: Record<string, string> = {\n playgroud: \"Playground\", // typo da SI9 (sem \"n\")\n sauna: \"Sauna\",\n pool: \"Piscina\",\n gym: \"Academia\",\n fireplace: \"Lareira\",\n gourmetSpace: \"Espaço gourmet\",\n multisportCourt: \"Quadra poliesportiva\",\n partyRoom: \"Salão de festas\",\n whirlpool: \"Hidromassagem\",\n}\n\n// ========================================\n// Rural (características rurais)\n// ========================================\nexport const RURAL_LABELS: Record<string, string> = {\n river: \"Rio\",\n mine: \"Mina\",\n hose: \"Mangueira\",\n footballField: \"Campo de futebol\",\n}\n\n// ========================================\n// Enums (campos string com valores fixos)\n// ========================================\n\nexport const SITUATION_LABELS: Record<string, string> = {\n AVALIABLE: \"Disponível\",\n INACTIVE: \"Inativo\",\n RENTED: \"Alugado\",\n RESERVED: \"Reservado\",\n SOLD: \"Vendido\",\n INVOICE: \"Em faturamento\",\n TODOCUMENT: \"Em documentação\",\n DELETE: \"Excluído\",\n TERMINATION: \"Rescisão\",\n RENOVATION: \"Em reforma\",\n}\n\nexport const HEATING_LABELS: Record<string, string> = {\n GAS: \"Gás\",\n SOLAR: \"Solar\",\n ELETRIC: \"Elétrico\",\n}\n\nexport const POSITION_SUN_LABELS: Record<string, string> = {\n NORTH: \"Norte\",\n SOUTH: \"Sul\",\n EAST: \"Leste\",\n WEST: \"Oeste\",\n}\n\nexport const POSITION_COURT_LABELS: Record<string, string> = {\n MIDDLE_COURT: \"Meio de quadra\",\n CORNER: \"Esquina\",\n SUB_CORNER: \"Sub-esquina\",\n}\n\nexport const PAVEMENT_LABELS: Record<string, string> = {\n COBBLESTONE: \"Paralelepípedo\",\n ASPHALT: \"Asfalto\",\n GRAVEL: \"Cascalho\",\n}\n\n// ========================================\n// Helpers\n// ========================================\n\n/**\n * Traduz um valor de enum usando mapa de labels\n * Retorna o valor original se não encontrar tradução\n */\nexport function enumToLabel(\n value: string | null | undefined,\n labelMap: Record<string, string>,\n): string | null {\n if (!value) return null\n return labelMap[value] ?? value\n}\n\n// ========================================\n// Helper genérico\n// ========================================\n\n/**\n * Converte um objeto com campos booleanos em um array de labels PT-BR\n * Filtra apenas os campos que são `true` (ignora false/null/undefined)\n *\n * @param obj Objeto com campos booleanos (ex: features, security, recreation)\n * @param labelMap Mapa de tradução (ex: FEATURES_LABELS)\n * @returns Array de labels em PT-BR\n */\nexport function booleanFieldsToLabels(\n obj: Record<string, unknown> | null | undefined,\n labelMap: Record<string, string>,\n): string[] {\n if (!obj) return []\n\n const labels: string[] = []\n\n for (const [key, label] of Object.entries(labelMap)) {\n if (obj[key] === true) {\n labels.push(label)\n }\n }\n\n return labels\n}\n","import type { Si9PropertySchema } from \"../../schemas/si9-property-schema.zod\"\nimport type { HorizonPropertySchemaBySi9Type } from \"../../schemas/horizon-property-schema-by-si9.zod\"\nimport {\n FEATURES_LABELS,\n SECURITY_LABELS,\n RECREATION_LABELS,\n RURAL_LABELS,\n SITUATION_LABELS,\n HEATING_LABELS,\n POSITION_SUN_LABELS,\n POSITION_COURT_LABELS,\n PAVEMENT_LABELS,\n booleanFieldsToLabels,\n enumToLabel,\n} from \"../../helpers/si9-labels\"\n\n/**\n * Converte campos específicos do SI9 (não existem no schema base Horizon)\n *\n * Convenção (Regras de Normalização):\n * - Regra 3: campos aninhados ganham prefixo do grupo (dimensions_, features_, etc.)\n * - Regra 4: booleans agrupados viram array (features, security, recreation, rural)\n * - Regra 5: tudo snake_case minúsculo\n */\nexport function convertExtendedFields(\n imovel: Si9PropertySchema,\n): Partial<HorizonPropertySchemaBySi9Type> {\n const result: Partial<HorizonPropertySchemaBySi9Type> = {}\n\n // ========== values.* ==========\n const values = imovel.values\n if (values) {\n if (values.discountValue && values.discountValue > 0)\n result.values_discount_value = values.discountValue\n if (values.fciValue && values.fciValue > 0)\n result.values_fci_value = values.fciValue\n if (values.assignedValue && values.assignedValue > 0)\n result.values_assigned_value = values.assignedValue\n if (values.trashFee && values.trashFee > 0)\n result.values_trash_fee = values.trashFee\n if (values.disasterFee && values.disasterFee > 0)\n result.values_disaster_fee = values.disasterFee\n }\n\n // ========== general_data.* ==========\n const ACCEPTED_SITUATIONS = [\"SOLD\", \"RENTED\", \"RESERVED\"]\n if (imovel.generalData?.situation && ACCEPTED_SITUATIONS.includes(imovel.generalData.situation))\n result.general_data_situation = imovel.generalData.situation\n if (imovel.generalData?.board)\n result.general_data_board = imovel.generalData.board\n // general_data_allotment REMOVIDO — já vai pro condominio_nome no base\n\n // ========== website.* ==========\n if (imovel.website?.superHighlight === true)\n result.website_super_highlight = true\n if (imovel.website?.showInCore === true)\n result.website_show_in_core = true\n if (imovel.website?.mcmv === true)\n result.website_mcmv = true\n\n // ========== destination.* ==========\n if (imovel.destination?.exchange === true)\n result.destination_exchange = true\n\n // ========== location.* (complementar) ==========\n const loc = imovel.location\n if (loc) {\n if (loc.apartment) result.location_apartment = loc.apartment\n if (loc.block) result.location_block = loc.block\n if (loc.floor) result.location_floor = loc.floor\n if (loc.quatrain) result.location_quatrain = loc.quatrain\n if (loc.lot) result.location_lot = loc.lot\n }\n\n // ========== dimensions.* ==========\n const dim = imovel.dimensions\n if (dim) {\n if (dim.buildingArea && dim.buildingArea > 0)\n result.dimensions_building_area = dim.buildingArea\n if (dim.landArea && dim.landArea > 0)\n result.dimensions_land_area = dim.landArea\n if (dim.internalArea && dim.internalArea > 0)\n result.dimensions_internal_area = dim.internalArea\n if (dim.registeredArea && dim.registeredArea > 0)\n result.dimensions_registered_area = dim.registeredArea\n if (dim.commonArea && dim.commonArea > 0)\n result.dimensions_common_area = dim.commonArea\n if (dim.garageArea && dim.garageArea > 0)\n result.dimensions_garage_area = dim.garageArea\n if (dim.frontSize && dim.frontSize > 0)\n result.dimensions_front_size = dim.frontSize\n if (dim.fundsSize && dim.fundsSize > 0)\n result.dimensions_funds_size = dim.fundsSize\n if (dim.leftSize && dim.leftSize > 0)\n result.dimensions_left_size = dim.leftSize\n if (dim.rightSize && dim.rightSize > 0)\n result.dimensions_right_size = dim.rightSize\n }\n\n // ========== features (booleans → array) ==========\n const feat = imovel.features\n const features = booleanFieldsToLabels(\n feat as Record<string, unknown> | undefined,\n FEATURES_LABELS,\n )\n if (features.length > 0) result.features = features\n\n // ========== features.* (numbers/strings) ==========\n if (feat) {\n if (feat.room && feat.room > 0) result.features_room = feat.room\n if (feat.kitchen && feat.kitchen > 0) result.features_kitchen = feat.kitchen\n if (feat.closet && feat.closet > 0) result.features_closet = feat.closet\n if (feat.balcony && feat.balcony > 0) result.features_balcony = feat.balcony\n if (feat.arCondicionado && feat.arCondicionado > 0)\n result.features_ar_condicionado = feat.arCondicionado\n if (feat.toilet && feat.toilet > 0) result.features_toilet = feat.toilet\n if (feat.floor) result.features_floor = feat.floor\n if (feat.roof) result.features_roof = feat.roof\n if (feat.ceiling) result.features_ceiling = feat.ceiling\n if (feat.paving) result.features_paving = feat.paving\n if (feat.pavement) result.features_pavement = feat.pavement\n }\n\n // ========== security (booleans → array) ==========\n const security = booleanFieldsToLabels(\n imovel.security as Record<string, unknown> | undefined,\n SECURITY_LABELS,\n )\n if (security.length > 0) result.security = security\n\n // ========== recreation (booleans → array) ==========\n const recreation = booleanFieldsToLabels(\n imovel.recreation as Record<string, unknown> | undefined,\n RECREATION_LABELS,\n )\n if (recreation.length > 0) result.recreation = recreation\n\n // ========== recreation.* (enums) ==========\n if (imovel.recreation?.heating)\n result.recreation_heating = imovel.recreation.heating\n if (imovel.recreation?.positionSun)\n result.recreation_position_sun = imovel.recreation.positionSun\n if (imovel.recreation?.positionCourt)\n result.recreation_position_court = imovel.recreation.positionCourt\n\n // ========== rural (booleans → array) ==========\n const rural = imovel.rural\n if (rural) {\n const ruralLabels = booleanFieldsToLabels(\n rural as Record<string, unknown>,\n RURAL_LABELS,\n )\n if (ruralLabels.length > 0) result.rural = ruralLabels\n\n // rural.* (numbers/strings)\n if (rural.bushels && rural.bushels > 0) result.rural_bushels = rural.bushels\n if (rural.acre && rural.acre > 0) result.rural_acre = rural.acre\n if (rural.pasture) result.rural_pasture = rural.pasture\n if (rural.mechanized) result.rural_mechanized = rural.mechanized\n if (rural.reserve && rural.reserve > 0) result.rural_reserve = rural.reserve\n if (rural.pigsty && rural.pigsty > 0) result.rural_pigsty = rural.pigsty\n if (rural.aviary && rural.aviary > 0) result.rural_aviary = rural.aviary\n if (rural.weir && rural.weir > 0) result.rural_weir = rural.weir\n if (rural.woodHouse && rural.woodHouse > 0)\n result.rural_wood_house = rural.woodHouse\n if (rural.brickHouse && rural.brickHouse > 0)\n result.rural_brick_house = rural.brickHouse\n if (rural.mixedHouse && rural.mixedHouse > 0)\n result.rural_mixed_house = rural.mixedHouse\n }\n\n // ========== fields (campos extras) ==========\n const fields = imovel.fields\n if (fields && fields.length > 0) {\n const fieldsFormatados = fields\n .filter((f) => f.field)\n .map((f) => ({\n field: String(f.field),\n value: String(f.value || \"\"),\n }))\n if (fieldsFormatados.length > 0) result.fields = fieldsFormatados\n }\n\n return result\n}\n","import { safeValidateSi9PropertySchema } from \"../../schemas/si9-property-schema.zod\"\nimport type { HorizonPropertySchemaBySi9Type } from \"../../schemas/horizon-property-schema-by-si9.zod\"\nimport { convertBaseFields } from \"./convertBaseFields\"\nimport { convertExtendedFields } from \"./convertExtendedFields\"\n\n/**\n * Converte um imóvel do formato SI9 para o formato Horizon Property\n *\n * Dividido em duas partes:\n * 1. Base Fields: campos que existem no horizon-property-schema-base\n * 2. Extended Fields: campos específicos do SI9 (não existem no schema base)\n */\nexport function convertSi9PropertyToHorizon(\n rawImovel: unknown,\n): HorizonPropertySchemaBySi9Type {\n // Validar entrada com Zod (safe parse)\n const validation = safeValidateSi9PropertySchema(rawImovel)\n\n if (!validation.success) {\n const errors = validation.error.issues\n .map((i) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\"; \")\n throw new Error(`Validação SI9 falhou: ${errors}`)\n }\n\n const imovel = validation.data\n\n // Converter campos base + estendidos\n const baseFields = convertBaseFields(imovel)\n const extendedFields = convertExtendedFields(imovel)\n\n // Combinar\n const result = {\n ...baseFields,\n ...extendedFields,\n }\n\n return result as HorizonPropertySchemaBySi9Type\n}\n\n// Re-exportar as funções individuais\nexport { convertBaseFields } from \"./convertBaseFields\"\nexport { convertExtendedFields } from \"./convertExtendedFields\"\n","import { promises as fs } from \"fs\"\nimport { join } from \"path\"\n\n// ========== TIPOS ==========\n\nexport interface SI9Credentials {\n\tusername: string\n\tpassword: string\n\tauthorization: string\n}\n\nexport interface PropertyDownloaderConfig {\n\tcredentials: SI9Credentials\n\toutputDir: string\n\tbaseUrl?: string\n}\n\nexport interface DownloadResult {\n\ttotalItems: number\n\tdownloadedItems: number\n\terrors: string[]\n}\n\ninterface TokenResponse {\n\taccess_token: string\n\trefresh_token: string\n\ttoken_type: string\n\texpires_in: number\n}\n\n// ========== CREDENCIAIS PADRÃO (conta Ghisi) ==========\n\nexport const SI9_DEFAULT_CREDENTIALS: SI9Credentials = {\n\tusername: \"ghisi-api\",\n\tpassword: \"y6HyTKxAZ40tx8D8w%5E3)\",\n\tauthorization: \"ZDc3ZmYyMzUtNmEyNS00YzE3LWI4NDktNjM3NWQ2NGM0ZTVhOmI2ZDhhMTgxLTQ5OWEtNGRjNi1hNGU0LTlkZTUxZjNjMDE5Nw==\",\n}\n\n// ========== DOWNLOADER ==========\n\nexport class PropertyDownloader {\n\tprivate credentials: SI9Credentials\n\tprivate baseUrl: string\n\tprivate outputDir: string\n\tprivate token: string | null = null\n\tprivate tokenExpiresAt: number = 0\n\n\tconstructor(config: PropertyDownloaderConfig) {\n\t\tthis.credentials = config.credentials\n\t\tthis.baseUrl = config.baseUrl || \"https://api.si9sistemas.com.br/imobilsi9-api\"\n\t\tthis.outputDir = config.outputDir\n\t}\n\n\t/**\n\t * Autentica via OAuth 2.0 Password Grant\n\t * IMPORTANTE: NÃO enviar Content-Type no auth (causa 500 na API)\n\t */\n\tprivate async authenticate(): Promise<TokenResponse> {\n\t\tconst url =\n\t\t\t`${this.baseUrl}/oauth/token?grant_type=password` +\n\t\t\t`&username=${this.credentials.username}` +\n\t\t\t`&password=${this.credentials.password}`\n\n\t\tconsole.log(`🔐 Autenticando na SI9...`)\n\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Basic ${this.credentials.authorization}`,\n\t\t\t},\n\t\t})\n\n\t\tif (!response.ok) {\n\t\t\tconst errorText = await response.text()\n\t\t\tthrow new Error(`Erro de autenticação ${response.status}: ${errorText}`)\n\t\t}\n\n\t\tconst data = (await response.json()) as TokenResponse\n\t\tconsole.log(`✅ Token obtido (expira em ${data.expires_in}s)`)\n\t\treturn data\n\t}\n\n\t/**\n\t * Garante que o token está válido, renovando se necessário\n\t * Margem de segurança: renova 60s antes de expirar\n\t */\n\tprivate async ensureToken(): Promise<void> {\n\t\tif (this.token && Date.now() < this.tokenExpiresAt) return\n\n\t\tconst auth = await this.authenticate()\n\t\tthis.token = auth.access_token\n\t\tthis.tokenExpiresAt = Date.now() + auth.expires_in * 1000 - 60000\n\t}\n\n\t/**\n\t * Busca todos os imóveis (SI9 não tem paginação)\n\t */\n\tprivate async getProperties(): Promise<any[]> {\n\t\tawait this.ensureToken()\n\n\t\tconst url = `${this.baseUrl}/property`\n\t\tconsole.log(`🔗 Requisição: GET ${url}`)\n\n\t\tconst response = await fetch(url, {\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Bearer ${this.token}`,\n\t\t\t},\n\t\t})\n\n\t\tif (!response.ok) {\n\t\t\tconst errorText = await response.text()\n\t\t\tthrow new Error(`Erro ${response.status}: ${errorText}`)\n\t\t}\n\n\t\treturn (await response.json()) as any[]\n\t}\n\n\tprivate async ensureOutputDir(): Promise<void> {\n\t\ttry {\n\t\t\tawait fs.access(this.outputDir)\n\t\t} catch {\n\t\t\tawait fs.mkdir(this.outputDir, { recursive: true })\n\t\t}\n\t}\n\n\t/**\n\t * Baixa TODOS os imóveis e salva em arquivo único\n\t * (SI9 não tem paginação — retorna tudo de uma vez)\n\t */\n\tasync downloadAll(): Promise<DownloadResult> {\n\t\tawait this.ensureOutputDir()\n\n\t\tconst errors: string[] = []\n\t\tlet downloadedItems = 0\n\n\t\tconsole.log(`🚀 Iniciando download completo da API SI9...`)\n\t\tconsole.log(`📁 Salvando em: ${this.outputDir}`)\n\n\t\ttry {\n\t\t\tconst properties = await this.getProperties()\n\n\t\t\tif (!Array.isArray(properties)) {\n\t\t\t\tthrow new Error(`Resposta inesperada: esperava array, recebeu ${typeof properties}`)\n\t\t\t}\n\n\t\t\tdownloadedItems = properties.length\n\t\t\tconsole.log(`📊 Recebidos: ${downloadedItems} imóveis`)\n\n\t\t\tif (downloadedItems > 0) {\n\t\t\t\tconst filePath = join(this.outputDir, \"all-properties.json\")\n\t\t\t\tawait fs.writeFile(filePath, JSON.stringify(properties, null, 2), \"utf8\")\n\t\t\t\tconsole.log(`✅ Salvo em: all-properties.json`)\n\t\t\t} else {\n\t\t\t\tconsole.log(`⚠️ Nenhum imóvel retornado (array vazio)`)\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconst errorMsg = `Erro no download: ${error instanceof Error ? error.message : String(error)}`\n\t\t\terrors.push(errorMsg)\n\t\t\tconsole.error(`❌ ${errorMsg}`)\n\t\t}\n\n\t\t// Resumo final\n\t\tconsole.log(`\\n📊 RESUMO DO DOWNLOAD:`)\n\t\tconsole.log(`✅ Propriedades baixadas: ${downloadedItems}`)\n\t\tif (errors.length > 0) {\n\t\t\tconsole.log(`❌ Erros: ${errors.length}`)\n\t\t\terrors.forEach((err) => console.log(` - ${err}`))\n\t\t}\n\n\t\treturn {\n\t\t\ttotalItems: downloadedItems,\n\t\t\tdownloadedItems,\n\t\t\terrors,\n\t\t}\n\t}\n}\n","/**\n * SI9 Extended Schema - v3.1.0\n *\n * Schema estendido do Horizon Base com campos específicos do SI9 CRM\n * Todas as keys em snake_case minúsculo (Regra 5)\n * Campos aninhados com prefixo do grupo (Regra 3)\n * Cada campo tem audit.source descrevendo a origem no CRM\n */\n\nimport type { EntitySchema } from \"@horizon-domains/property-model\";\nimport { horizonPropertySchemaBase } from \"@horizon-domains/property-model\";\n\n/**\n * Mapa de source para os 45 campos base do Horizon\n * Descreve de onde cada campo foi captado na API SI9\n */\nconst BASE_SOURCE_MAP: Record<string, string> = {\n\t// Sistema\n\tsource_published_at: \"(Vazio - não disponível na API)\",\n\tsource_updated_at: \"gerado com new Date().toISOString()\",\n\tcurrency: \"fixo 'BRL'\",\n\tunit_area: \"fixo 'm2'\",\n\tunit_distance: \"fixo 'meters'\",\n\n\t// Cabeçalho\n\treference: \"id (number→string)\",\n\ttitle: \"generalData.title\",\n\tdescription: \"generalData.description\",\n\n\t// SEO\n\tseo_slug: \"(Vazio - não disponível na API)\",\n\tseo_title: \"(Vazio - não disponível na API)\",\n\tseo_description: \"(Vazio - não disponível na API)\",\n\tseo_keywords: \"(Vazio - não disponível na API)\",\n\n\t// Mídia\n\tmain_image: \"images[0] (filtrar displaySite=true, primeira imagem)\",\n\timages: \"images[] (filtrar displaySite=true, excluir pic360)\",\n\tvideos: \"generalData.urlVideo (array com 1 item se existir)\",\n\tvirtual_tours: \"generalData.urlTour (array com 1 item se existir)\",\n\n\t// Ficha técnica\n\toperacao: \"destination.sale→'venda', destination.rent→'locacao', destination.season→'temporada' (array)\",\n\ttipo: \"generalData.category.name\",\n\tdormitorios: \"features.bedroom\",\n\tsuites: \"features.suite\",\n\tbanheiros: \"features.bathroom (só bathroom, toilet vai pra features_toilet separado)\",\n\tvagas_garagem: \"features.coveredGarage + features.outdoorGarage (soma cobertas + descobertas)\",\n\tarea_total: \"dimensions.totalArea (m²)\",\n\tarea_privativa: \"dimensions.privateArea (m²)\",\n\tarea_util: \"dimensions.usefulArea (m²)\",\n\tdestaque: \"website.highlight || website.superHighlight (true se qualquer um true)\",\n\n\t// Valores\n\tvalor_venda: \"values.saleValue (REAIS, só se destination.sale=true e > 0)\",\n\tvalor_locacao: \"values.rentValue (REAIS, só se destination.rent=true e > 0)\",\n\tvalor_condominio: \"values.condominiumFee (REAIS)\",\n\tvalor_iptu: \"values.iptuValue (REAIS, ANUAL)\",\n\n\t// Localização\n\tendereco_cep: \"location.zipCode (formatado 00000-000)\",\n\tendereco_estado: \"location.city.state\",\n\tendereco_cidade: \"location.city.name\",\n\tendereco_bairro: \"location.district.name\",\n\tendereco_logradouro: \"location.address\",\n\tendereco_numero: \"location.number\",\n\tendereco_complemento: \"location.complement\",\n\tendereco_referencia: \"location.referencePoint\",\n\tendereco_zona: \"(Vazio - não disponível na API)\",\n\tlat: \"location.latitude (string→number)\",\n\tlng: \"location.longitude (string→number)\",\n\n\t// Relações\n\tcorretor_key: \"(Vazio - não disponível na API)\",\n\tcorretor_nome: \"Campo personalizado 'Corretor' (se existir)\",\n\tcondominio_key: \"(Vazio - não disponível na API)\",\n\tcondominio_nome: \"generalData.allotment (nome do empreendimento/loteamento/edifício)\",\n};\n\nexport const HorizonPropertySchemaBySi9: EntitySchema = {\n\tentity: \"property\",\n\tversion: \"3.2.0\",\n\tdescription: \"Schema estendido SI9 CRM — 45 base com source tracking + extras snake_case\",\n\tfields: [\n\t\t// Injeta source nos campos base\n\t\t...horizonPropertySchemaBase.fields.map((field) => ({\n\t\t\t...field,\n\t\t\taudit: {\n\t\t\t\t...field.audit,\n\t\t\t\t...(BASE_SOURCE_MAP[field.key] ? { source: BASE_SOURCE_MAP[field.key] } : {}),\n\t\t\t},\n\t\t})),\n\n\t\t// ========================================\n\t\t// values.*\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"values_discount_value\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"currency\",\n\t\t\tunit: \"BRL\",\n\t\t\tcategories: [\"valores\"],\n\t\t\tui: { label: \"Valor de desconto\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"values.discountValue (REAIS)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"values_fci_value\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"currency\",\n\t\t\tunit: \"BRL\",\n\t\t\tcategories: [\"valores\"],\n\t\t\tui: { label: \"Valor FCI\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"values.fciValue (REAIS)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"values_assigned_value\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"currency\",\n\t\t\tunit: \"BRL\",\n\t\t\tcategories: [\"valores\"],\n\t\t\tui: { label: \"Valor atribuído\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"values.assignedValue (REAIS)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"values_trash_fee\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"currency\",\n\t\t\tunit: \"BRL\",\n\t\t\tcategories: [\"valores\"],\n\t\t\tui: { label: \"Taxa de lixo\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"values.trashFee (REAIS)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"values_disaster_fee\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"currency\",\n\t\t\tunit: \"BRL\",\n\t\t\tcategories: [\"valores\"],\n\t\t\tui: { label: \"Taxa de sinistro\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"values.disasterFee (REAIS)\" },\n\t\t},\n\n\t\t// ========================================\n\t\t// general_data.*\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"general_data_situation\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"situacoes\"],\n\t\t\tui: { label: \"Situação\" },\n\t\t\tenum: {\n\t\t\t\tSOLD: \"Vendido\",\n\t\t\t\tRENTED: \"Alugado\",\n\t\t\t\tRESERVED: \"Reservado\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"si9:property\",\n\t\t\t\tsource:\n\t\t\t\t\t\"generalData.situation (enum: AVALIABLE, INACTIVE, RENTED, RESERVED, SOLD, INVOICE, TODOCUMENT, DELETE, TERMINATION, RENOVATION)\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"general_data_board\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"comercial\"],\n\t\t\tui: { label: \"Placa\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"generalData.board\" },\n\t\t},\n\n\t\t// ========================================\n\t\t// website.*\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"website_super_highlight\",\n\t\t\ttype: \"Boolean\",\n\t\t\tcategories: [\"comercial\"],\n\t\t\tui: { label: \"Super destaque\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"website.superHighlight\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"website_show_in_core\",\n\t\t\ttype: \"Boolean\",\n\t\t\tcategories: [\"comercial\"],\n\t\t\tui: { label: \"Publicado no núcleo\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"website.showInCore\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"website_mcmv\",\n\t\t\ttype: \"Boolean\",\n\t\t\tcategories: [\"comercial\"],\n\t\t\tui: { label: \"Minha Casa Minha Vida\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"website.mcmv\" },\n\t\t},\n\n\t\t// ========================================\n\t\t// destination.*\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"destination_exchange\",\n\t\t\ttype: \"Boolean\",\n\t\t\tcategories: [\"comercial\"],\n\t\t\tui: { label: \"Aceita permuta\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"destination.exchange\" },\n\t\t},\n\n\t\t// ========================================\n\t\t// location.* (complementar)\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"location_apartment\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"endereco\"],\n\t\t\tui: { label: \"Apartamento\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"location.apartment\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"location_block\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"endereco\"],\n\t\t\tui: { label: \"Bloco\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"location.block\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"location_floor\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"endereco\"],\n\t\t\tui: { label: \"Andar\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"location.floor (string: '1', '10', 'Terreo')\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"location_quatrain\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"endereco\"],\n\t\t\tui: { label: \"Quadra\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"location.quatrain\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"location_lot\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"endereco\"],\n\t\t\tui: { label: \"Lote\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"location.lot\" },\n\t\t},\n\n\t\t// ========================================\n\t\t// dimensions.*\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"dimensions_building_area\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"area\",\n\t\t\tunit: \"m2\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Área construída\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.buildingArea (m²)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"dimensions_land_area\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"area\",\n\t\t\tunit: \"m2\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Área do terreno\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.landArea (m²)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"dimensions_internal_area\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"area\",\n\t\t\tunit: \"m2\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Área interna\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.internalArea (m²)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"dimensions_registered_area\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"area\",\n\t\t\tunit: \"m2\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Área registrada\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.registeredArea (m²)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"dimensions_common_area\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"area\",\n\t\t\tunit: \"m2\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Área comum\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.commonArea (m²)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"dimensions_garage_area\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"area\",\n\t\t\tunit: \"m2\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Área da garagem\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.garageArea (m²)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"dimensions_front_size\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"distance\",\n\t\t\tunit: \"m\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Frente do terreno\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.frontSize (metros)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"dimensions_funds_size\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"distance\",\n\t\t\tunit: \"m\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Fundos do terreno\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.fundsSize (metros)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"dimensions_left_size\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"distance\",\n\t\t\tunit: \"m\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Lateral esquerda\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.leftSize (metros)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"dimensions_right_size\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"distance\",\n\t\t\tunit: \"m\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Lateral direita\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.rightSize (metros)\" },\n\t\t},\n\n\t\t// ========================================\n\t\t// features (booleans → array) + features.* (numbers/strings)\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"features\",\n\t\t\ttype: \"String[]\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tdb: { type: \"jsonb\", index: \"gin\" },\n\t\t\tui: { label: \"Características\" },\n\t\t\taudit: {\n\t\t\t\torigin: \"si9:property\",\n\t\t\t\tsource: \"features booleans true → labels PT-BR via FEATURES_LABELS (27 booleans)\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"features_room\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tui: { label: \"Salas\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.room\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_kitchen\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tui: { label: \"Cozinhas\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.kitchen\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_closet\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tui: { label: \"Closets\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.closet\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_balcony\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tui: { label: \"Sacadas\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.balcony\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_ar_condicionado\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tui: { label: \"Ar condicionado\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.arCondicionado (quantidade)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_toilet\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tui: { label: \"Lavabos\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.toilet (separado de banheiros)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_floor\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"estrutura\"],\n\t\t\tui: { label: \"Tipo de piso\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.floor (ex: Porcelanato, Madeira)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_roof\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"estrutura\"],\n\t\t\tui: { label: \"Tipo de telhado\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.roof (ex: Cerâmico, Laje)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_ceiling\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"estrutura\"],\n\t\t\tui: { label: \"Tipo de forro\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.ceiling (ex: Gesso, PVC, Laje)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_paving\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"estrutura\"],\n\t\t\tui: { label: \"Pavimentação interna\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.paving (string livre, dados inconsistentes)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_pavement\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"estrutura\"],\n\t\t\tui: { label: \"Tipo de calçamento\" },\n\t\t\tenum: { COBBLESTONE: \"Paralelepípedo\", ASPHALT: \"Asfalto\", GRAVEL: \"Cascalho\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.pavement (enum: COBBLESTONE, ASPHALT, GRAVEL)\" },\n\t\t},\n\n\t\t// ========================================\n\t\t// security (booleans → array)\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"security\",\n\t\t\ttype: \"String[]\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tdb: { type: \"jsonb\", index: \"gin\" },\n\t\t\tui: { label: \"Segurança\" },\n\t\t\taudit: {\n\t\t\t\torigin: \"si9:property\",\n\t\t\t\tsource: \"security booleans true → labels PT-BR via SECURITY_LABELS (8 booleans)\",\n\t\t\t},\n\t\t},\n\n\t\t// ========================================\n\t\t// recreation (booleans → array) + recreation.* (enums)\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"recreation\",\n\t\t\ttype: \"String[]\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tdb: { type: \"jsonb\", index: \"gin\" },\n\t\t\tui: { label: \"Lazer\" },\n\t\t\taudit: {\n\t\t\t\torigin: \"si9:property\",\n\t\t\t\tsource: \"recreation booleans true → labels PT-BR via RECREATION_LABELS (9 booleans)\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"recreation_heating\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"estrutura\"],\n\t\t\tui: { label: \"Aquecimento\" },\n\t\t\tenum: { GAS: \"Gás\", SOLAR: \"Solar\", ELETRIC: \"Elétrico\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"recreation.heating (enum: GAS, SOLAR, ELETRIC)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"recreation_position_sun\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"estrutura\"],\n\t\t\tui: { label: \"Posição solar\" },\n\t\t\tenum: { NORTH: \"Norte\", SOUTH: \"Sul\", EAST: \"Leste\", WEST: \"Oeste\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"recreation.positionSun (enum: NORTH, SOUTH, EAST, WEST)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"recreation_position_court\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"estrutura\"],\n\t\t\tui: { label: \"Posição na quadra\" },\n\t\t\tenum: { MIDDLE_COURT: \"Meio de quadra\", CORNER: \"Esquina\", SUB_CORNER: \"Sub-esquina\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"recreation.positionCourt (enum: MIDDLE_COURT, CORNER, SUB_CORNER)\" },\n\t\t},\n\n\t\t// ========================================\n\t\t// rural (booleans → array) + rural.* (numbers/strings)\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"rural\",\n\t\t\ttype: \"String[]\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tdb: { type: \"jsonb\", index: \"gin\" },\n\t\t\tui: { label: \"Características rurais\" },\n\t\t\taudit: {\n\t\t\t\torigin: \"si9:property\",\n\t\t\t\tsource: \"rural booleans true → labels PT-BR via RURAL_LABELS (4 booleans: river, mine, hose, footballField)\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_bushels\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Sacas\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.bushels (capacidade produtiva)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_acre\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Alqueires\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.acre\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_pasture\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Pastagem\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.pasture (ex: formado, degradado)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_mechanized\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Mecanizada\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.mechanized (ex: total, parcial)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_reserve\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Reserva\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.reserve (hectares)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_pigsty\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Pocilgas\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.pigsty\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_aviary\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Aviários\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.aviary\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_weir\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Açudes\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.weir\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_wood_house\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Casas de madeira\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.woodHouse\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_brick_house\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Casas de alvenaria\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.brickHouse\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_mixed_house\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Casas mistas\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.mixedHouse\" },\n\t\t},\n\n\t\t// ========================================\n\t\t// fields (campos extras)\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"fields\",\n\t\t\ttype: \"Json\",\n\t\t\tcategories: [\"dados-extras\"],\n\t\t\tdb: { type: \"jsonb\" },\n\t\t\tui: { label: \"Campos extras\" },\n\t\t\taudit: {\n\t\t\t\torigin: \"si9:property\",\n\t\t\t\tsource: \"fields[] ({field, value} — campos personalizados criados pela imobiliária)\",\n\t\t\t},\n\t\t},\n\t],\n};\n\nexport default HorizonPropertySchemaBySi9;\n","import { z } from \"zod\"\nimport { HorizonPropertySchemaBaseZod } from \"@horizon-domains/property-model\"\n\n// ========================================\n// SCHEMAS DE MÍDIA (override para opcional)\n// ========================================\nconst ImageSchema = z\n .object({\n md: z.string().optional(),\n sm: z.string().optional(),\n full: z.string().optional(),\n cover: z.boolean().optional(),\n })\n .passthrough()\n\nconst VideoSchema = z\n .object({\n url: z.string().optional(),\n embed_url: z.string().optional(),\n })\n .passthrough()\n\nconst VirtualTourSchema = z\n .object({\n embed_url: z.string().optional(),\n })\n .passthrough()\n\nconst MainImageSchema = z\n .object({\n md: z.string().optional(),\n sm: z.string().optional(),\n full: z.string().optional(),\n })\n .passthrough()\n\n// ========================================\n// Schema Horizon para SI9 CRM\n// Todas as keys em snake_case minúsculo\n// Campos aninhados com prefixo do grupo (Regra 3+5)\n// ========================================\n\nexport const HorizonPropertySchemaBySi9Zod = HorizonPropertySchemaBaseZod\n .omit({ images: true, videos: true, virtual_tours: true, main_image: true })\n .extend({\n // Mídia (override mais flexível)\n images: z.array(ImageSchema).optional(),\n videos: z.array(VideoSchema).optional(),\n virtual_tours: z.array(VirtualTourSchema).optional(),\n main_image: MainImageSchema.optional(),\n\n // ========================================\n // SI9 EXTRAS — values.*\n // ========================================\n values_discount_value: z.number().min(0).optional(),\n values_fci_value: z.number().min(0).optional(),\n values_assigned_value: z.number().min(0).optional(),\n values_trash_fee: z.number().min(0).optional(),\n values_disaster_fee: z.number().min(0).optional(),\n\n // ========================================\n // SI9 EXTRAS — general_data.*\n // ========================================\n general_data_situation: z.string().optional(),\n general_data_board: z.string().optional(),\n general_data_allotment: z.string().optional(),\n\n // ========================================\n // SI9 EXTRAS — website.*\n // ========================================\n website_super_highlight: z.boolean().optional(),\n website_show_in_core: z.boolean().optional(),\n website_mcmv: z.boolean().optional(),\n\n // ========================================\n // SI9 EXTRAS — destination.*\n // ========================================\n destination_exchange: z.boolean().optional(),\n\n // ========================================\n // SI9 EXTRAS — location.* (complementar)\n // ========================================\n location_apartment: z.string().optional(),\n location_block: z.string().optional(),\n location_floor: z.string().optional(),\n location_quatrain: z.string().optional(),\n location_lot: z.string().optional(),\n\n // ========================================\n // SI9 EXTRAS — dimensions.*\n // ========================================\n dimensions_building_area: z.number().min(0).optional(),\n dimensions_land_area: z.number().min(0).optional(),\n dimensions_internal_area: z.number().min(0).optional(),\n dimensions_registered_area: z.number().min(0).optional(),\n dimensions_common_area: z.number().min(0).optional(),\n dimensions_garage_area: z.number().min(0).optional(),\n dimensions_front_size: z.number().min(0).optional(),\n dimensions_funds_size: z.number().min(0).optional(),\n dimensions_left_size: z.number().min(0).optional(),\n dimensions_right_size: z.number().min(0).optional(),\n\n // ========================================\n // SI9 EXTRAS — features (booleans → array)\n // ========================================\n features: z.array(z.string()).optional(),\n\n // ========================================\n // SI9 EXTRAS — features.* (numbers/strings)\n // ========================================\n features_room: z.number().optional(),\n features_kitchen: z.number().optional(),\n features_closet: z.number().optional(),\n features_balcony: z.number().optional(),\n features_ar_condicionado: z.number().optional(),\n features_toilet: z.number().optional(),\n features_floor: z.string().optional(),\n features_roof: z.string().optional(),\n features_ceiling: z.string().optional(),\n features_paving: z.string().optional(),\n features_pavement: z.string().optional(),\n\n // ========================================\n // SI9 EXTRAS — security (booleans → array)\n // ========================================\n security: z.array(z.string()).optional(),\n\n // ========================================\n // SI9 EXTRAS — recreation (booleans → array)\n // ========================================\n recreation: z.array(z.string()).optional(),\n\n // ========================================\n // SI9 EXTRAS — recreation.* (strings/enums)\n // ========================================\n recreation_heating: z.string().optional(),\n recreation_position_sun: z.string().optional(),\n recreation_position_court: z.string().optional(),\n\n // ========================================\n // SI9 EXTRAS — rural (booleans → array)\n // ========================================\n rural: z.array(z.string()).optional(),\n\n // ========================================\n // SI9 EXTRAS — rural.* (numbers/strings)\n // ========================================\n rural_bushels: z.number().optional(),\n rural_acre: z.number().optional(),\n rural_pasture: z.string().optional(),\n rural_mechanized: z.string().optional(),\n rural_reserve: z.number().optional(),\n rural_pigsty: z.number().optional(),\n rural_aviary: z.number().optional(),\n rural_weir: z.number().optional(),\n rural_wood_house: z.number().optional(),\n rural_brick_house: z.number().optional(),\n rural_mixed_house: z.number().optional(),\n\n // ========================================\n // SI9 EXTRAS — fields (campos extras)\n // ========================================\n fields: z\n .array(\n z.object({\n field: z.string(),\n value: z.string(),\n }),\n )\n .optional(),\n\n })\n .passthrough()\n\n// Tipo inferido\nexport type HorizonPropertySchemaBySi9Type = z.infer<\n typeof HorizonPropertySchemaBySi9Zod\n>\n\n// Helper de validação\nexport const validateHorizonPropertySchemaBySi9 = (\n data: unknown,\n): HorizonPropertySchemaBySi9Type => {\n return HorizonPropertySchemaBySi9Zod.parse(data)\n}\n\n// Helper de validação safe\nexport const safeValidateHorizonPropertySchemaBySi9 = (data: unknown) => {\n return HorizonPropertySchemaBySi9Zod.safeParse(data)\n}\n\n// Helper de validação parcial\nexport const validatePartialHorizonPropertySchemaBySi9 = (data: unknown) => {\n return HorizonPropertySchemaBySi9Zod.partial().parse(data)\n}\n"],"mappings":"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","names":["fs","import_zod","import_property_model"]}
package/dist/index.mjs CHANGED
@@ -867,7 +867,7 @@ var HorizonPropertySchemaBySi9 = {
867
867
  key: "website_show_in_core",
868
868
  type: "Boolean",
869
869
  categories: ["comercial"],
870
- ui: { label: "Mostrar no portal" },
870
+ ui: { label: "Publicado no n\xFAcleo" },
871
871
  audit: { origin: "si9:property", source: "website.showInCore" }
872
872
  },
873
873
  {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/schemas/si9-property-schema.zod.ts","../src/services/PropertyConverter/convertBaseFields.ts","../src/helpers/si9-labels.ts","../src/services/PropertyConverter/convertExtendedFields.ts","../src/services/PropertyConverter/index.ts","../src/services/PropertyDownloader.ts","../src/schemas/horizon-property-schema-by-si9.ts","../src/schemas/horizon-property-schema-by-si9.zod.ts"],"sourcesContent":["import { z } from \"zod\"\n\n// ========================================\n// Sub-schemas SI9\n// ========================================\n\nconst categorySchema = z\n .object({\n id: z.number().nullish(),\n name: z.string().nullish(),\n })\n .passthrough()\n\nconst generalDataSchema = z\n .object({\n board: z.string().nullish(),\n situation: z.string().nullish(),\n category: categorySchema.nullish(),\n description: z.string().nullish(),\n title: z.string().nullish(),\n allotment: z.string().nullish(),\n costCenter: z.string().nullish(),\n urlVideo: z.string().nullish(),\n urlTour: z.string().nullish(),\n })\n .passthrough()\n\nconst destinationSchema = z\n .object({\n sale: z.boolean().nullish(),\n rent: z.boolean().nullish(),\n season: z.boolean().nullish(),\n private: z.boolean().nullish(),\n application: z.boolean().nullish(),\n exchange: z.boolean().nullish(),\n })\n .passthrough()\n\nconst valuesSchema = z\n .object({\n saleValue: z.number().nullish(),\n rentValue: z.number().nullish(),\n discountValue: z.number().nullish(),\n fciValue: z.number().nullish(),\n iptuValue: z.number().nullish(),\n assignedValue: z.number().nullish(),\n trashFee: z.number().nullish(),\n disasterFee: z.number().nullish(),\n condominiumFee: z.number().nullish(),\n })\n .passthrough()\n\nconst citySchema = z\n .object({\n id: z.union([z.number(), z.null()]).nullish(),\n name: z.string().nullish(),\n state: z.string().nullish(),\n })\n .passthrough()\n\nconst districtSchema = z\n .object({\n id: z.union([z.number(), z.null()]).nullish(),\n name: z.string().nullish(),\n })\n .passthrough()\n\nconst locationSchema = z\n .object({\n city: citySchema.nullish(),\n address: z.string().nullish(),\n number: z.string().nullish(),\n zipCode: z.string().nullish(),\n district: districtSchema.nullish(),\n apartment: z.string().nullish(),\n block: z.string().nullish(),\n floor: z.string().nullish(),\n quatrain: z.string().nullish(),\n lot: z.string().nullish(),\n complement: z.string().nullish(),\n referencePoint: z.string().nullish(),\n longitude: z.string().nullish(),\n latitude: z.string().nullish(),\n blocksMap: z.unknown().nullish(),\n })\n .passthrough()\n\nconst websiteSchema = z\n .object({\n highlight: z.boolean().nullish(),\n superHighlight: z.boolean().nullish(),\n showInCore: z.boolean().nullish(),\n mcmv: z.boolean().nullish(),\n })\n .passthrough()\n\nconst dimensionsSchema = z\n .object({\n buildingArea: z.number().nullish(),\n landArea: z.number().nullish(),\n usefulArea: z.number().nullish(),\n privateArea: z.number().nullish(),\n internalArea: z.number().nullish(),\n registeredArea: z.number().nullish(),\n totalArea: z.number().nullish(),\n commonArea: z.number().nullish(),\n garageArea: z.number().nullish(),\n frontSize: z.number().nullish(),\n fundsSize: z.number().nullish(),\n leftSize: z.number().nullish(),\n rightSize: z.number().nullish(),\n })\n .passthrough()\n\nconst featuresSchema = z\n .object({\n // Numéricos\n room: z.number().nullish(),\n kitchen: z.number().nullish(),\n bedroom: z.number().nullish(),\n suite: z.number().nullish(),\n closet: z.number().nullish(),\n bathroom: z.number().nullish(),\n toilet: z.number().nullish(),\n balcony: z.number().nullish(),\n coveredGarage: z.number().nullish(),\n outdoorGarage: z.number().nullish(),\n arCondicionado: z.number().nullish(),\n\n // Acabamentos (string/enum)\n floor: z.string().nullish(),\n roof: z.string().nullish(),\n ceiling: z.string().nullish(),\n paving: z.string().nullish(),\n pavement: z.string().nullish(),\n\n // Booleans\n shed: z.boolean().nullish(),\n needMaid: z.boolean().nullish(),\n serviceArea: z.boolean().nullish(),\n pantry: z.boolean().nullish(),\n furnished: z.boolean().nullish(),\n semiFurnished: z.boolean().nullish(),\n wineHouse: z.boolean().nullish(),\n fittedKitchen: z.boolean().nullish(),\n kennel: z.boolean().nullish(),\n waterTank: z.boolean().nullish(),\n barbecueGrill: z.boolean().nullish(),\n telephone: z.boolean().nullish(),\n porchWithGrill: z.boolean().nullish(),\n elevator: z.boolean().nullish(),\n porch: z.boolean().nullish(),\n winterGarden: z.boolean().nullish(),\n penthouseApartment: z.boolean().nullish(),\n highStandard: z.boolean().nullish(),\n release: z.boolean().nullish(),\n condominium: z.boolean().nullish(),\n inPlant: z.boolean().nullish(),\n coast: z.boolean().nullish(),\n serviceBathroom: z.boolean().nullish(),\n lounge: z.boolean().nullish(),\n onlineConcierge: z.boolean().nullish(),\n demiSuite: z.boolean().nullish(),\n newOrSemiNew: z.boolean().nullish(),\n })\n .passthrough()\n\nconst securitySchema = z\n .object({\n alarm: z.boolean().nullish(),\n electricFence: z.boolean().nullish(),\n intercom: z.boolean().nullish(),\n concierge: z.boolean().nullish(),\n walled: z.boolean().nullish(),\n gate: z.boolean().nullish(),\n electronicGate: z.boolean().nullish(),\n protectionGrid: z.boolean().nullish(),\n })\n .passthrough()\n\nconst recreationSchema = z\n .object({\n playgroud: z.boolean().nullish(), // typo da SI9 (sem \"n\")\n sauna: z.boolean().nullish(),\n pool: z.boolean().nullish(),\n gym: z.boolean().nullish(),\n fireplace: z.boolean().nullish(),\n gourmetSpace: z.boolean().nullish(),\n multisportCourt: z.boolean().nullish(),\n partyRoom: z.boolean().nullish(),\n whirlpool: z.boolean().nullish(),\n heating: z.string().nullish(),\n positionSun: z.string().nullish(),\n positionCourt: z.string().nullish(),\n })\n .passthrough()\n\nconst ruralSchema = z\n .object({\n river: z.boolean().nullish(),\n mine: z.boolean().nullish(),\n hose: z.boolean().nullish(),\n footballField: z.boolean().nullish(),\n bushels: z.number().nullish(),\n acre: z.number().nullish(),\n pasture: z.string().nullish(),\n mechanized: z.string().nullish(),\n reserve: z.number().nullish(),\n pigsty: z.number().nullish(),\n aviary: z.number().nullish(),\n weir: z.number().nullish(),\n woodHouse: z.number().nullish(),\n brickHouse: z.number().nullish(),\n mixedHouse: z.number().nullish(),\n })\n .passthrough()\n\nconst companySchema = z\n .object({\n id: z.number().nullish(),\n fancyName: z.string().nullish(),\n corporateName: z.string().nullish(),\n address: z.string().nullish(),\n phoneNumber: z.string().nullish(),\n siteUrl: z.string().nullish(),\n })\n .passthrough()\n\nconst imageSchema = z\n .object({\n url: z.string().nullish(),\n subtitle: z.string().nullish(),\n displaySite: z.boolean().nullish(),\n pic360: z.union([z.boolean(), z.string()]).nullish(),\n })\n .passthrough()\n\nconst fieldSchema = z\n .object({\n field: z.string().nullish(),\n value: z.unknown().nullish(),\n })\n .passthrough()\n\n// ========================================\n// Schema principal SI9\n// ========================================\n\nconst brokerSchema = z\n .object({\n id: z.number().nullish(),\n name: z.string().nullish(),\n cellphone: z.string().nullish(),\n photoUrl: z.string().nullish(),\n creci: z.string().nullish(),\n })\n .passthrough()\n\nexport const Si9PropertySchemaZod = z\n .object({\n id: z.number(),\n generalData: generalDataSchema.nullish(),\n destination: destinationSchema.nullish(),\n values: valuesSchema.nullish(),\n location: locationSchema.nullish(),\n website: websiteSchema.nullish(),\n dimensions: dimensionsSchema.nullish(),\n features: featuresSchema.nullish(),\n security: securitySchema.nullish(),\n recreation: recreationSchema.nullish(),\n rural: ruralSchema.nullish(),\n company: companySchema.nullish(),\n broker: brokerSchema.nullish(),\n images: z.array(imageSchema).nullish(),\n fields: z.array(fieldSchema).nullish(),\n })\n .passthrough()\n\n// Tipo inferido\nexport type Si9PropertySchema = z.infer<typeof Si9PropertySchemaZod>\n\n// Helper de validação\nexport const validateSi9PropertySchema = (data: unknown): Si9PropertySchema => {\n return Si9PropertySchemaZod.parse(data)\n}\n\n// Helper de validação safe\nexport const safeValidateSi9PropertySchema = (data: unknown) => {\n return Si9PropertySchemaZod.safeParse(data)\n}\n","import type { Si9PropertySchema } from \"../../schemas/si9-property-schema.zod\"\nimport type { HorizonPropertySchemaBySi9Type } from \"../../schemas/horizon-property-schema-by-si9.zod\"\n\n/**\n * Mapa de chaves reconhecidas nos fields customizados\n * Nomes em português legível (aparecem nos portais)\n */\nconst FIELDS_RECONHECIDOS: Record<\n string,\n (result: Partial<HorizonPropertySchemaBySi9Type>, value: string) => void\n> = {\n \"Geolocalização aproximada\": (result, _value) => {\n // geo_aproximado é objeto { lat, lng } — só pode ser preenchido se já tiver lat/lng\n // Será tratado após o processamento de coordenadas\n },\n}\n\n/**\n * Converte campos do schema base Horizon (campos padrão que existem em todos os property models)\n * Conforme PLANO_CONVERSOR.md\n */\nexport function convertBaseFields(\n imovel: Si9PropertySchema,\n): Partial<HorizonPropertySchemaBySi9Type> {\n const result: Partial<HorizonPropertySchemaBySi9Type> = {}\n\n // ========== IDENTIFICAÇÃO BÁSICA ==========\n result.reference = String(imovel.id)\n result.title = imovel.generalData?.title || \"Sem título\"\n result.description = imovel.generalData?.description || \"Sem descrição\"\n\n // SI9 não tem campo de data de atualização — usar data da sincronização\n result.source_updated_at = new Date().toISOString()\n\n // source_published_at: deixar vazio (CRM tem dtCadastro mas API não expõe)\n\n // ========== CONFIGURAÇÕES ==========\n result.currency = \"BRL\"\n result.unit_area = \"m2\"\n result.unit_distance = \"meters\"\n\n // ========== OPERAÇÃO ==========\n const dest = imovel.destination\n if (dest) {\n const operacao: (\"venda\" | \"locacao\" | \"temporada\")[] = []\n if (dest.sale) operacao.push(\"venda\")\n if (dest.rent) operacao.push(\"locacao\")\n if (dest.season) operacao.push(\"temporada\")\n if (operacao.length > 0) result.operacao = operacao\n }\n\n // ========== TIPO ==========\n if (imovel.generalData?.category?.name) {\n result.tipo = imovel.generalData.category.name\n }\n\n // ========== VALORES MONETÁRIOS ==========\n // Valores em REAIS (R$) — NÃO dividir por 100\n const values = imovel.values\n if (values) {\n if (values.saleValue && values.saleValue > 0 && imovel.destination?.sale) {\n result.valor_venda = values.saleValue\n }\n if (values.rentValue && values.rentValue > 0 && imovel.destination?.rent) {\n result.valor_locacao = values.rentValue\n }\n if (values.condominiumFee && values.condominiumFee > 0) {\n result.valor_condominio = values.condominiumFee\n }\n if (values.iptuValue && values.iptuValue > 0) {\n result.valor_iptu = values.iptuValue\n }\n }\n\n // ========== ÁREAS ==========\n const dim = imovel.dimensions\n if (dim) {\n if (dim.totalArea && dim.totalArea > 0) result.area_total = dim.totalArea\n if (dim.privateArea && dim.privateArea > 0)\n result.area_privativa = dim.privateArea\n if (dim.usefulArea && dim.usefulArea > 0) result.area_util = dim.usefulArea\n }\n\n // ========== DEPENDÊNCIAS (features numéricos) ==========\n const feat = imovel.features\n if (feat) {\n if (feat.bedroom && feat.bedroom > 0) result.dormitorios = feat.bedroom\n if (feat.suite && feat.suite > 0) result.suites = feat.suite\n\n // Banheiros = só bathroom (toilet/lavabo vai como campo extra separado)\n if (feat.bathroom && feat.bathroom > 0) result.banheiros = feat.bathroom\n\n // Garagens = coveredGarage + outdoorGarage\n const covered = feat.coveredGarage || 0\n const outdoor = feat.outdoorGarage || 0\n const totalGaragens = covered + outdoor\n if (totalGaragens > 0) result.vagas_garagem = totalGaragens\n }\n\n // ========== ENDEREÇO ==========\n const loc = imovel.location\n if (loc) {\n // CEP: formatar 00000-000\n if (loc.zipCode) {\n const cepLimpo = loc.zipCode.replace(/\\D/g, \"\")\n if (cepLimpo.length === 8) {\n result.endereco_cep = `${cepLimpo.slice(0, 5)}-${cepLimpo.slice(5)}`\n } else {\n result.endereco_cep = loc.zipCode\n }\n }\n\n if (loc.city?.state) result.endereco_estado = loc.city.state\n if (loc.city?.name) result.endereco_cidade = loc.city.name\n if (loc.district?.name) result.endereco_bairro = loc.district.name\n if (loc.address) result.endereco_logradouro = loc.address\n if (loc.number) result.endereco_numero = loc.number\n if (loc.complement) result.endereco_complemento = loc.complement\n if (loc.referencePoint) result.endereco_referencia = loc.referencePoint\n\n // Coordenadas (vem como string, converter para number)\n if (loc.latitude && loc.longitude) {\n const lat = Number(loc.latitude)\n const lng = Number(loc.longitude)\n if (!isNaN(lat) && !isNaN(lng) && lat !== 0 && lng !== 0) {\n result.lat = lat\n result.lng = lng\n }\n }\n }\n\n // ========== CORRETOR (broker nativo da API) ==========\n if (imovel.broker?.id) {\n result.corretor_key = String(imovel.broker.id)\n }\n if (imovel.broker?.name) {\n result.corretor_nome = imovel.broker.name\n }\n\n // ========== CONDOMÍNIO ==========\n if (imovel.generalData?.allotment) {\n result.condominio_nome = imovel.generalData.allotment\n }\n\n // ========== DESTAQUE ==========\n if (imovel.website?.highlight || imovel.website?.superHighlight) {\n result.destaque = true\n }\n\n // ========== IMAGENS ==========\n if (imovel.images && imovel.images.length > 0) {\n // Filtrar apenas imagens com displaySite=true (ou sem a flag)\n const visibleImages = imovel.images.filter(\n (img) => img.displaySite !== false && img.url,\n )\n\n result.images = visibleImages.map((img, index) => ({\n full: img.url || \"\",\n md: img.url || \"\",\n sm: img.url || \"\",\n cover: index === 0,\n }))\n\n // Main image = primeira imagem\n if (visibleImages.length > 0 && visibleImages[0].url) {\n result.main_image = {\n full: visibleImages[0].url,\n md: visibleImages[0].url,\n sm: visibleImages[0].url,\n }\n }\n } else {\n result.images = []\n }\n\n // ========== VÍDEOS ==========\n if (imovel.generalData?.urlVideo) {\n const url = imovel.generalData.urlVideo\n result.videos = [\n {\n url,\n embed_url: url,\n },\n ]\n } else {\n result.videos = []\n }\n\n // ========== TOURS VIRTUAIS ==========\n if (imovel.generalData?.urlTour) {\n result.virtual_tours = [\n {\n embed_url: imovel.generalData.urlTour,\n },\n ]\n } else {\n result.virtual_tours = []\n }\n\n // ========== SEO ==========\n // Não fabricar fallbacks — se o CRM não tem SEO nativo, fica vazio\n // O front-end resolve na hora de renderizar\n\n // ========== FIELDS → chaves reconhecidas ==========\n const fields = imovel.fields\n if (fields && fields.length > 0) {\n // Chaves reconhecidas: copiar pra campos Horizon\n for (const f of fields) {\n if (!f.field) continue\n const handler = FIELDS_RECONHECIDOS[String(f.field)]\n if (handler) {\n handler(result, String(f.value || \"\"))\n }\n }\n\n // geo_aproximado: se \"Geolocalização aproximada\" existe E temos lat/lng\n const hasGeoField = fields.some(\n (f) => String(f.field) === \"Geolocalização aproximada\",\n )\n if (hasGeoField && result.lat && result.lng) {\n result.geo_aproximado = {\n lat: result.lat,\n lng: result.lng,\n }\n }\n }\n\n return result\n}\n","/**\n * Mapas de tradução boolean → label PT-BR para campos da SI9\n * Converte campos booleanos `true` em arrays de strings descritivas\n */\n\n// ========================================\n// Features (características do imóvel)\n// ========================================\nexport const FEATURES_LABELS: Record<string, string> = {\n shed: \"Galpão\",\n needMaid: \"Dependência de empregada\",\n serviceArea: \"Área de serviço\",\n pantry: \"Despensa\",\n furnished: \"Mobiliado\",\n semiFurnished: \"Semi-mobiliado\",\n wineHouse: \"Adega\",\n fittedKitchen: \"Cozinha planejada\",\n kennel: \"Canil\",\n waterTank: \"Cisterna\",\n barbecueGrill: \"Churrasqueira\",\n telephone: \"Telefone\",\n porchWithGrill: \"Varanda gourmet\",\n elevator: \"Elevador\",\n porch: \"Varanda\",\n winterGarden: \"Jardim de inverno\",\n penthouseApartment: \"Cobertura\",\n highStandard: \"Alto padrão\",\n release: \"Lançamento\",\n condominium: \"Condomínio\",\n inPlant: \"Na planta\",\n coast: \"Litoral\",\n serviceBathroom: \"Banheiro de serviço\",\n lounge: \"Sala de estar\",\n onlineConcierge: \"Portaria online\",\n demiSuite: \"Demi-suíte\",\n newOrSemiNew: \"Novo ou seminovo\",\n}\n\n// ========================================\n// Security (segurança)\n// ========================================\nexport const SECURITY_LABELS: Record<string, string> = {\n alarm: \"Alarme\",\n electricFence: \"Cerca elétrica\",\n intercom: \"Interfone\",\n concierge: \"Portaria\",\n walled: \"Murado\",\n gate: \"Portão\",\n electronicGate: \"Portão eletrônico\",\n protectionGrid: \"Grade de proteção\",\n}\n\n// ========================================\n// Recreation (lazer)\n// ========================================\nexport const RECREATION_LABELS: Record<string, string> = {\n playgroud: \"Playground\", // typo da SI9 (sem \"n\")\n sauna: \"Sauna\",\n pool: \"Piscina\",\n gym: \"Academia\",\n fireplace: \"Lareira\",\n gourmetSpace: \"Espaço gourmet\",\n multisportCourt: \"Quadra poliesportiva\",\n partyRoom: \"Salão de festas\",\n whirlpool: \"Hidromassagem\",\n}\n\n// ========================================\n// Rural (características rurais)\n// ========================================\nexport const RURAL_LABELS: Record<string, string> = {\n river: \"Rio\",\n mine: \"Mina\",\n hose: \"Mangueira\",\n footballField: \"Campo de futebol\",\n}\n\n// ========================================\n// Enums (campos string com valores fixos)\n// ========================================\n\nexport const SITUATION_LABELS: Record<string, string> = {\n AVALIABLE: \"Disponível\",\n INACTIVE: \"Inativo\",\n RENTED: \"Alugado\",\n RESERVED: \"Reservado\",\n SOLD: \"Vendido\",\n INVOICE: \"Em faturamento\",\n TODOCUMENT: \"Em documentação\",\n DELETE: \"Excluído\",\n TERMINATION: \"Rescisão\",\n RENOVATION: \"Em reforma\",\n}\n\nexport const HEATING_LABELS: Record<string, string> = {\n GAS: \"Gás\",\n SOLAR: \"Solar\",\n ELETRIC: \"Elétrico\",\n}\n\nexport const POSITION_SUN_LABELS: Record<string, string> = {\n NORTH: \"Norte\",\n SOUTH: \"Sul\",\n EAST: \"Leste\",\n WEST: \"Oeste\",\n}\n\nexport const POSITION_COURT_LABELS: Record<string, string> = {\n MIDDLE_COURT: \"Meio de quadra\",\n CORNER: \"Esquina\",\n SUB_CORNER: \"Sub-esquina\",\n}\n\nexport const PAVEMENT_LABELS: Record<string, string> = {\n COBBLESTONE: \"Paralelepípedo\",\n ASPHALT: \"Asfalto\",\n GRAVEL: \"Cascalho\",\n}\n\n// ========================================\n// Helpers\n// ========================================\n\n/**\n * Traduz um valor de enum usando mapa de labels\n * Retorna o valor original se não encontrar tradução\n */\nexport function enumToLabel(\n value: string | null | undefined,\n labelMap: Record<string, string>,\n): string | null {\n if (!value) return null\n return labelMap[value] ?? value\n}\n\n// ========================================\n// Helper genérico\n// ========================================\n\n/**\n * Converte um objeto com campos booleanos em um array de labels PT-BR\n * Filtra apenas os campos que são `true` (ignora false/null/undefined)\n *\n * @param obj Objeto com campos booleanos (ex: features, security, recreation)\n * @param labelMap Mapa de tradução (ex: FEATURES_LABELS)\n * @returns Array de labels em PT-BR\n */\nexport function booleanFieldsToLabels(\n obj: Record<string, unknown> | null | undefined,\n labelMap: Record<string, string>,\n): string[] {\n if (!obj) return []\n\n const labels: string[] = []\n\n for (const [key, label] of Object.entries(labelMap)) {\n if (obj[key] === true) {\n labels.push(label)\n }\n }\n\n return labels\n}\n","import type { Si9PropertySchema } from \"../../schemas/si9-property-schema.zod\"\nimport type { HorizonPropertySchemaBySi9Type } from \"../../schemas/horizon-property-schema-by-si9.zod\"\nimport {\n FEATURES_LABELS,\n SECURITY_LABELS,\n RECREATION_LABELS,\n RURAL_LABELS,\n SITUATION_LABELS,\n HEATING_LABELS,\n POSITION_SUN_LABELS,\n POSITION_COURT_LABELS,\n PAVEMENT_LABELS,\n booleanFieldsToLabels,\n enumToLabel,\n} from \"../../helpers/si9-labels\"\n\n/**\n * Converte campos específicos do SI9 (não existem no schema base Horizon)\n *\n * Convenção (Regras de Normalização):\n * - Regra 3: campos aninhados ganham prefixo do grupo (dimensions_, features_, etc.)\n * - Regra 4: booleans agrupados viram array (features, security, recreation, rural)\n * - Regra 5: tudo snake_case minúsculo\n */\nexport function convertExtendedFields(\n imovel: Si9PropertySchema,\n): Partial<HorizonPropertySchemaBySi9Type> {\n const result: Partial<HorizonPropertySchemaBySi9Type> = {}\n\n // ========== values.* ==========\n const values = imovel.values\n if (values) {\n if (values.discountValue && values.discountValue > 0)\n result.values_discount_value = values.discountValue\n if (values.fciValue && values.fciValue > 0)\n result.values_fci_value = values.fciValue\n if (values.assignedValue && values.assignedValue > 0)\n result.values_assigned_value = values.assignedValue\n if (values.trashFee && values.trashFee > 0)\n result.values_trash_fee = values.trashFee\n if (values.disasterFee && values.disasterFee > 0)\n result.values_disaster_fee = values.disasterFee\n }\n\n // ========== general_data.* ==========\n const ACCEPTED_SITUATIONS = [\"SOLD\", \"RENTED\", \"RESERVED\"]\n if (imovel.generalData?.situation && ACCEPTED_SITUATIONS.includes(imovel.generalData.situation))\n result.general_data_situation = imovel.generalData.situation\n if (imovel.generalData?.board)\n result.general_data_board = imovel.generalData.board\n // general_data_allotment REMOVIDO — já vai pro condominio_nome no base\n\n // ========== website.* ==========\n if (imovel.website?.superHighlight === true)\n result.website_super_highlight = true\n if (imovel.website?.showInCore === true)\n result.website_show_in_core = true\n if (imovel.website?.mcmv === true)\n result.website_mcmv = true\n\n // ========== destination.* ==========\n if (imovel.destination?.exchange === true)\n result.destination_exchange = true\n\n // ========== location.* (complementar) ==========\n const loc = imovel.location\n if (loc) {\n if (loc.apartment) result.location_apartment = loc.apartment\n if (loc.block) result.location_block = loc.block\n if (loc.floor) result.location_floor = loc.floor\n if (loc.quatrain) result.location_quatrain = loc.quatrain\n if (loc.lot) result.location_lot = loc.lot\n }\n\n // ========== dimensions.* ==========\n const dim = imovel.dimensions\n if (dim) {\n if (dim.buildingArea && dim.buildingArea > 0)\n result.dimensions_building_area = dim.buildingArea\n if (dim.landArea && dim.landArea > 0)\n result.dimensions_land_area = dim.landArea\n if (dim.internalArea && dim.internalArea > 0)\n result.dimensions_internal_area = dim.internalArea\n if (dim.registeredArea && dim.registeredArea > 0)\n result.dimensions_registered_area = dim.registeredArea\n if (dim.commonArea && dim.commonArea > 0)\n result.dimensions_common_area = dim.commonArea\n if (dim.garageArea && dim.garageArea > 0)\n result.dimensions_garage_area = dim.garageArea\n if (dim.frontSize && dim.frontSize > 0)\n result.dimensions_front_size = dim.frontSize\n if (dim.fundsSize && dim.fundsSize > 0)\n result.dimensions_funds_size = dim.fundsSize\n if (dim.leftSize && dim.leftSize > 0)\n result.dimensions_left_size = dim.leftSize\n if (dim.rightSize && dim.rightSize > 0)\n result.dimensions_right_size = dim.rightSize\n }\n\n // ========== features (booleans → array) ==========\n const feat = imovel.features\n const features = booleanFieldsToLabels(\n feat as Record<string, unknown> | undefined,\n FEATURES_LABELS,\n )\n if (features.length > 0) result.features = features\n\n // ========== features.* (numbers/strings) ==========\n if (feat) {\n if (feat.room && feat.room > 0) result.features_room = feat.room\n if (feat.kitchen && feat.kitchen > 0) result.features_kitchen = feat.kitchen\n if (feat.closet && feat.closet > 0) result.features_closet = feat.closet\n if (feat.balcony && feat.balcony > 0) result.features_balcony = feat.balcony\n if (feat.arCondicionado && feat.arCondicionado > 0)\n result.features_ar_condicionado = feat.arCondicionado\n if (feat.toilet && feat.toilet > 0) result.features_toilet = feat.toilet\n if (feat.floor) result.features_floor = feat.floor\n if (feat.roof) result.features_roof = feat.roof\n if (feat.ceiling) result.features_ceiling = feat.ceiling\n if (feat.paving) result.features_paving = feat.paving\n if (feat.pavement) result.features_pavement = feat.pavement\n }\n\n // ========== security (booleans → array) ==========\n const security = booleanFieldsToLabels(\n imovel.security as Record<string, unknown> | undefined,\n SECURITY_LABELS,\n )\n if (security.length > 0) result.security = security\n\n // ========== recreation (booleans → array) ==========\n const recreation = booleanFieldsToLabels(\n imovel.recreation as Record<string, unknown> | undefined,\n RECREATION_LABELS,\n )\n if (recreation.length > 0) result.recreation = recreation\n\n // ========== recreation.* (enums) ==========\n if (imovel.recreation?.heating)\n result.recreation_heating = imovel.recreation.heating\n if (imovel.recreation?.positionSun)\n result.recreation_position_sun = imovel.recreation.positionSun\n if (imovel.recreation?.positionCourt)\n result.recreation_position_court = imovel.recreation.positionCourt\n\n // ========== rural (booleans → array) ==========\n const rural = imovel.rural\n if (rural) {\n const ruralLabels = booleanFieldsToLabels(\n rural as Record<string, unknown>,\n RURAL_LABELS,\n )\n if (ruralLabels.length > 0) result.rural = ruralLabels\n\n // rural.* (numbers/strings)\n if (rural.bushels && rural.bushels > 0) result.rural_bushels = rural.bushels\n if (rural.acre && rural.acre > 0) result.rural_acre = rural.acre\n if (rural.pasture) result.rural_pasture = rural.pasture\n if (rural.mechanized) result.rural_mechanized = rural.mechanized\n if (rural.reserve && rural.reserve > 0) result.rural_reserve = rural.reserve\n if (rural.pigsty && rural.pigsty > 0) result.rural_pigsty = rural.pigsty\n if (rural.aviary && rural.aviary > 0) result.rural_aviary = rural.aviary\n if (rural.weir && rural.weir > 0) result.rural_weir = rural.weir\n if (rural.woodHouse && rural.woodHouse > 0)\n result.rural_wood_house = rural.woodHouse\n if (rural.brickHouse && rural.brickHouse > 0)\n result.rural_brick_house = rural.brickHouse\n if (rural.mixedHouse && rural.mixedHouse > 0)\n result.rural_mixed_house = rural.mixedHouse\n }\n\n // ========== fields (campos extras) ==========\n const fields = imovel.fields\n if (fields && fields.length > 0) {\n const fieldsFormatados = fields\n .filter((f) => f.field)\n .map((f) => ({\n field: String(f.field),\n value: String(f.value || \"\"),\n }))\n if (fieldsFormatados.length > 0) result.fields = fieldsFormatados\n }\n\n return result\n}\n","import { safeValidateSi9PropertySchema } from \"../../schemas/si9-property-schema.zod\"\nimport type { HorizonPropertySchemaBySi9Type } from \"../../schemas/horizon-property-schema-by-si9.zod\"\nimport { convertBaseFields } from \"./convertBaseFields\"\nimport { convertExtendedFields } from \"./convertExtendedFields\"\n\n/**\n * Converte um imóvel do formato SI9 para o formato Horizon Property\n *\n * Dividido em duas partes:\n * 1. Base Fields: campos que existem no horizon-property-schema-base\n * 2. Extended Fields: campos específicos do SI9 (não existem no schema base)\n */\nexport function convertSi9PropertyToHorizon(\n rawImovel: unknown,\n): HorizonPropertySchemaBySi9Type {\n // Validar entrada com Zod (safe parse)\n const validation = safeValidateSi9PropertySchema(rawImovel)\n\n if (!validation.success) {\n const errors = validation.error.issues\n .map((i) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\"; \")\n throw new Error(`Validação SI9 falhou: ${errors}`)\n }\n\n const imovel = validation.data\n\n // Converter campos base + estendidos\n const baseFields = convertBaseFields(imovel)\n const extendedFields = convertExtendedFields(imovel)\n\n // Combinar\n const result = {\n ...baseFields,\n ...extendedFields,\n }\n\n return result as HorizonPropertySchemaBySi9Type\n}\n\n// Re-exportar as funções individuais\nexport { convertBaseFields } from \"./convertBaseFields\"\nexport { convertExtendedFields } from \"./convertExtendedFields\"\n","import { promises as fs } from \"fs\"\nimport { join } from \"path\"\n\n// ========== TIPOS ==========\n\nexport interface SI9Credentials {\n\tusername: string\n\tpassword: string\n\tauthorization: string\n}\n\nexport interface PropertyDownloaderConfig {\n\tcredentials: SI9Credentials\n\toutputDir: string\n\tbaseUrl?: string\n}\n\nexport interface DownloadResult {\n\ttotalItems: number\n\tdownloadedItems: number\n\terrors: string[]\n}\n\ninterface TokenResponse {\n\taccess_token: string\n\trefresh_token: string\n\ttoken_type: string\n\texpires_in: number\n}\n\n// ========== CREDENCIAIS PADRÃO (conta Ghisi) ==========\n\nexport const SI9_DEFAULT_CREDENTIALS: SI9Credentials = {\n\tusername: \"ghisi-api\",\n\tpassword: \"y6HyTKxAZ40tx8D8w%5E3)\",\n\tauthorization: \"ZDc3ZmYyMzUtNmEyNS00YzE3LWI4NDktNjM3NWQ2NGM0ZTVhOmI2ZDhhMTgxLTQ5OWEtNGRjNi1hNGU0LTlkZTUxZjNjMDE5Nw==\",\n}\n\n// ========== DOWNLOADER ==========\n\nexport class PropertyDownloader {\n\tprivate credentials: SI9Credentials\n\tprivate baseUrl: string\n\tprivate outputDir: string\n\tprivate token: string | null = null\n\tprivate tokenExpiresAt: number = 0\n\n\tconstructor(config: PropertyDownloaderConfig) {\n\t\tthis.credentials = config.credentials\n\t\tthis.baseUrl = config.baseUrl || \"https://api.si9sistemas.com.br/imobilsi9-api\"\n\t\tthis.outputDir = config.outputDir\n\t}\n\n\t/**\n\t * Autentica via OAuth 2.0 Password Grant\n\t * IMPORTANTE: NÃO enviar Content-Type no auth (causa 500 na API)\n\t */\n\tprivate async authenticate(): Promise<TokenResponse> {\n\t\tconst url =\n\t\t\t`${this.baseUrl}/oauth/token?grant_type=password` +\n\t\t\t`&username=${this.credentials.username}` +\n\t\t\t`&password=${this.credentials.password}`\n\n\t\tconsole.log(`🔐 Autenticando na SI9...`)\n\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Basic ${this.credentials.authorization}`,\n\t\t\t},\n\t\t})\n\n\t\tif (!response.ok) {\n\t\t\tconst errorText = await response.text()\n\t\t\tthrow new Error(`Erro de autenticação ${response.status}: ${errorText}`)\n\t\t}\n\n\t\tconst data = (await response.json()) as TokenResponse\n\t\tconsole.log(`✅ Token obtido (expira em ${data.expires_in}s)`)\n\t\treturn data\n\t}\n\n\t/**\n\t * Garante que o token está válido, renovando se necessário\n\t * Margem de segurança: renova 60s antes de expirar\n\t */\n\tprivate async ensureToken(): Promise<void> {\n\t\tif (this.token && Date.now() < this.tokenExpiresAt) return\n\n\t\tconst auth = await this.authenticate()\n\t\tthis.token = auth.access_token\n\t\tthis.tokenExpiresAt = Date.now() + auth.expires_in * 1000 - 60000\n\t}\n\n\t/**\n\t * Busca todos os imóveis (SI9 não tem paginação)\n\t */\n\tprivate async getProperties(): Promise<any[]> {\n\t\tawait this.ensureToken()\n\n\t\tconst url = `${this.baseUrl}/property`\n\t\tconsole.log(`🔗 Requisição: GET ${url}`)\n\n\t\tconst response = await fetch(url, {\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Bearer ${this.token}`,\n\t\t\t},\n\t\t})\n\n\t\tif (!response.ok) {\n\t\t\tconst errorText = await response.text()\n\t\t\tthrow new Error(`Erro ${response.status}: ${errorText}`)\n\t\t}\n\n\t\treturn (await response.json()) as any[]\n\t}\n\n\tprivate async ensureOutputDir(): Promise<void> {\n\t\ttry {\n\t\t\tawait fs.access(this.outputDir)\n\t\t} catch {\n\t\t\tawait fs.mkdir(this.outputDir, { recursive: true })\n\t\t}\n\t}\n\n\t/**\n\t * Baixa TODOS os imóveis e salva em arquivo único\n\t * (SI9 não tem paginação — retorna tudo de uma vez)\n\t */\n\tasync downloadAll(): Promise<DownloadResult> {\n\t\tawait this.ensureOutputDir()\n\n\t\tconst errors: string[] = []\n\t\tlet downloadedItems = 0\n\n\t\tconsole.log(`🚀 Iniciando download completo da API SI9...`)\n\t\tconsole.log(`📁 Salvando em: ${this.outputDir}`)\n\n\t\ttry {\n\t\t\tconst properties = await this.getProperties()\n\n\t\t\tif (!Array.isArray(properties)) {\n\t\t\t\tthrow new Error(`Resposta inesperada: esperava array, recebeu ${typeof properties}`)\n\t\t\t}\n\n\t\t\tdownloadedItems = properties.length\n\t\t\tconsole.log(`📊 Recebidos: ${downloadedItems} imóveis`)\n\n\t\t\tif (downloadedItems > 0) {\n\t\t\t\tconst filePath = join(this.outputDir, \"all-properties.json\")\n\t\t\t\tawait fs.writeFile(filePath, JSON.stringify(properties, null, 2), \"utf8\")\n\t\t\t\tconsole.log(`✅ Salvo em: all-properties.json`)\n\t\t\t} else {\n\t\t\t\tconsole.log(`⚠️ Nenhum imóvel retornado (array vazio)`)\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconst errorMsg = `Erro no download: ${error instanceof Error ? error.message : String(error)}`\n\t\t\terrors.push(errorMsg)\n\t\t\tconsole.error(`❌ ${errorMsg}`)\n\t\t}\n\n\t\t// Resumo final\n\t\tconsole.log(`\\n📊 RESUMO DO DOWNLOAD:`)\n\t\tconsole.log(`✅ Propriedades baixadas: ${downloadedItems}`)\n\t\tif (errors.length > 0) {\n\t\t\tconsole.log(`❌ Erros: ${errors.length}`)\n\t\t\terrors.forEach((err) => console.log(` - ${err}`))\n\t\t}\n\n\t\treturn {\n\t\t\ttotalItems: downloadedItems,\n\t\t\tdownloadedItems,\n\t\t\terrors,\n\t\t}\n\t}\n}\n","/**\n * SI9 Extended Schema - v3.1.0\n *\n * Schema estendido do Horizon Base com campos específicos do SI9 CRM\n * Todas as keys em snake_case minúsculo (Regra 5)\n * Campos aninhados com prefixo do grupo (Regra 3)\n * Cada campo tem audit.source descrevendo a origem no CRM\n */\n\nimport type { EntitySchema } from \"@horizon-domains/property-model\";\nimport { horizonPropertySchemaBase } from \"@horizon-domains/property-model\";\n\n/**\n * Mapa de source para os 45 campos base do Horizon\n * Descreve de onde cada campo foi captado na API SI9\n */\nconst BASE_SOURCE_MAP: Record<string, string> = {\n\t// Sistema\n\tsource_published_at: \"(Vazio - não disponível na API)\",\n\tsource_updated_at: \"gerado com new Date().toISOString()\",\n\tcurrency: \"fixo 'BRL'\",\n\tunit_area: \"fixo 'm2'\",\n\tunit_distance: \"fixo 'meters'\",\n\n\t// Cabeçalho\n\treference: \"id (number→string)\",\n\ttitle: \"generalData.title\",\n\tdescription: \"generalData.description\",\n\n\t// SEO\n\tseo_slug: \"(Vazio - não disponível na API)\",\n\tseo_title: \"(Vazio - não disponível na API)\",\n\tseo_description: \"(Vazio - não disponível na API)\",\n\tseo_keywords: \"(Vazio - não disponível na API)\",\n\n\t// Mídia\n\tmain_image: \"images[0] (filtrar displaySite=true, primeira imagem)\",\n\timages: \"images[] (filtrar displaySite=true, excluir pic360)\",\n\tvideos: \"generalData.urlVideo (array com 1 item se existir)\",\n\tvirtual_tours: \"generalData.urlTour (array com 1 item se existir)\",\n\n\t// Ficha técnica\n\toperacao: \"destination.sale→'venda', destination.rent→'locacao', destination.season→'temporada' (array)\",\n\ttipo: \"generalData.category.name\",\n\tdormitorios: \"features.bedroom\",\n\tsuites: \"features.suite\",\n\tbanheiros: \"features.bathroom (só bathroom, toilet vai pra features_toilet separado)\",\n\tvagas_garagem: \"features.coveredGarage + features.outdoorGarage (soma cobertas + descobertas)\",\n\tarea_total: \"dimensions.totalArea (m²)\",\n\tarea_privativa: \"dimensions.privateArea (m²)\",\n\tarea_util: \"dimensions.usefulArea (m²)\",\n\tdestaque: \"website.highlight || website.superHighlight (true se qualquer um true)\",\n\n\t// Valores\n\tvalor_venda: \"values.saleValue (REAIS, só se destination.sale=true e > 0)\",\n\tvalor_locacao: \"values.rentValue (REAIS, só se destination.rent=true e > 0)\",\n\tvalor_condominio: \"values.condominiumFee (REAIS)\",\n\tvalor_iptu: \"values.iptuValue (REAIS, ANUAL)\",\n\n\t// Localização\n\tendereco_cep: \"location.zipCode (formatado 00000-000)\",\n\tendereco_estado: \"location.city.state\",\n\tendereco_cidade: \"location.city.name\",\n\tendereco_bairro: \"location.district.name\",\n\tendereco_logradouro: \"location.address\",\n\tendereco_numero: \"location.number\",\n\tendereco_complemento: \"location.complement\",\n\tendereco_referencia: \"location.referencePoint\",\n\tendereco_zona: \"(Vazio - não disponível na API)\",\n\tlat: \"location.latitude (string→number)\",\n\tlng: \"location.longitude (string→number)\",\n\n\t// Relações\n\tcorretor_key: \"(Vazio - não disponível na API)\",\n\tcorretor_nome: \"Campo personalizado 'Corretor' (se existir)\",\n\tcondominio_key: \"(Vazio - não disponível na API)\",\n\tcondominio_nome: \"generalData.allotment (nome do empreendimento/loteamento/edifício)\",\n};\n\nexport const HorizonPropertySchemaBySi9: EntitySchema = {\n\tentity: \"property\",\n\tversion: \"3.2.0\",\n\tdescription: \"Schema estendido SI9 CRM — 45 base com source tracking + extras snake_case\",\n\tfields: [\n\t\t// Injeta source nos campos base\n\t\t...horizonPropertySchemaBase.fields.map((field) => ({\n\t\t\t...field,\n\t\t\taudit: {\n\t\t\t\t...field.audit,\n\t\t\t\t...(BASE_SOURCE_MAP[field.key] ? { source: BASE_SOURCE_MAP[field.key] } : {}),\n\t\t\t},\n\t\t})),\n\n\t\t// ========================================\n\t\t// values.*\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"values_discount_value\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"currency\",\n\t\t\tunit: \"BRL\",\n\t\t\tcategories: [\"valores\"],\n\t\t\tui: { label: \"Valor de desconto\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"values.discountValue (REAIS)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"values_fci_value\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"currency\",\n\t\t\tunit: \"BRL\",\n\t\t\tcategories: [\"valores\"],\n\t\t\tui: { label: \"Valor FCI\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"values.fciValue (REAIS)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"values_assigned_value\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"currency\",\n\t\t\tunit: \"BRL\",\n\t\t\tcategories: [\"valores\"],\n\t\t\tui: { label: \"Valor atribuído\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"values.assignedValue (REAIS)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"values_trash_fee\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"currency\",\n\t\t\tunit: \"BRL\",\n\t\t\tcategories: [\"valores\"],\n\t\t\tui: { label: \"Taxa de lixo\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"values.trashFee (REAIS)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"values_disaster_fee\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"currency\",\n\t\t\tunit: \"BRL\",\n\t\t\tcategories: [\"valores\"],\n\t\t\tui: { label: \"Taxa de sinistro\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"values.disasterFee (REAIS)\" },\n\t\t},\n\n\t\t// ========================================\n\t\t// general_data.*\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"general_data_situation\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"situacoes\"],\n\t\t\tui: { label: \"Situação\" },\n\t\t\tenum: {\n\t\t\t\tSOLD: \"Vendido\",\n\t\t\t\tRENTED: \"Alugado\",\n\t\t\t\tRESERVED: \"Reservado\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"si9:property\",\n\t\t\t\tsource:\n\t\t\t\t\t\"generalData.situation (enum: AVALIABLE, INACTIVE, RENTED, RESERVED, SOLD, INVOICE, TODOCUMENT, DELETE, TERMINATION, RENOVATION)\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"general_data_board\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"comercial\"],\n\t\t\tui: { label: \"Placa\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"generalData.board\" },\n\t\t},\n\n\t\t// ========================================\n\t\t// website.*\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"website_super_highlight\",\n\t\t\ttype: \"Boolean\",\n\t\t\tcategories: [\"comercial\"],\n\t\t\tui: { label: \"Super destaque\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"website.superHighlight\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"website_show_in_core\",\n\t\t\ttype: \"Boolean\",\n\t\t\tcategories: [\"comercial\"],\n\t\t\tui: { label: \"Mostrar no portal\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"website.showInCore\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"website_mcmv\",\n\t\t\ttype: \"Boolean\",\n\t\t\tcategories: [\"comercial\"],\n\t\t\tui: { label: \"Minha Casa Minha Vida\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"website.mcmv\" },\n\t\t},\n\n\t\t// ========================================\n\t\t// destination.*\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"destination_exchange\",\n\t\t\ttype: \"Boolean\",\n\t\t\tcategories: [\"comercial\"],\n\t\t\tui: { label: \"Aceita permuta\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"destination.exchange\" },\n\t\t},\n\n\t\t// ========================================\n\t\t// location.* (complementar)\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"location_apartment\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"endereco\"],\n\t\t\tui: { label: \"Apartamento\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"location.apartment\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"location_block\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"endereco\"],\n\t\t\tui: { label: \"Bloco\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"location.block\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"location_floor\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"endereco\"],\n\t\t\tui: { label: \"Andar\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"location.floor (string: '1', '10', 'Terreo')\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"location_quatrain\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"endereco\"],\n\t\t\tui: { label: \"Quadra\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"location.quatrain\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"location_lot\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"endereco\"],\n\t\t\tui: { label: \"Lote\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"location.lot\" },\n\t\t},\n\n\t\t// ========================================\n\t\t// dimensions.*\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"dimensions_building_area\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"area\",\n\t\t\tunit: \"m2\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Área construída\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.buildingArea (m²)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"dimensions_land_area\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"area\",\n\t\t\tunit: \"m2\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Área do terreno\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.landArea (m²)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"dimensions_internal_area\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"area\",\n\t\t\tunit: \"m2\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Área interna\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.internalArea (m²)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"dimensions_registered_area\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"area\",\n\t\t\tunit: \"m2\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Área registrada\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.registeredArea (m²)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"dimensions_common_area\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"area\",\n\t\t\tunit: \"m2\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Área comum\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.commonArea (m²)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"dimensions_garage_area\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"area\",\n\t\t\tunit: \"m2\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Área da garagem\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.garageArea (m²)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"dimensions_front_size\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"distance\",\n\t\t\tunit: \"m\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Frente do terreno\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.frontSize (metros)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"dimensions_funds_size\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"distance\",\n\t\t\tunit: \"m\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Fundos do terreno\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.fundsSize (metros)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"dimensions_left_size\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"distance\",\n\t\t\tunit: \"m\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Lateral esquerda\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.leftSize (metros)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"dimensions_right_size\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"distance\",\n\t\t\tunit: \"m\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Lateral direita\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.rightSize (metros)\" },\n\t\t},\n\n\t\t// ========================================\n\t\t// features (booleans → array) + features.* (numbers/strings)\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"features\",\n\t\t\ttype: \"String[]\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tdb: { type: \"jsonb\", index: \"gin\" },\n\t\t\tui: { label: \"Características\" },\n\t\t\taudit: {\n\t\t\t\torigin: \"si9:property\",\n\t\t\t\tsource: \"features booleans true → labels PT-BR via FEATURES_LABELS (27 booleans)\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"features_room\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tui: { label: \"Salas\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.room\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_kitchen\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tui: { label: \"Cozinhas\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.kitchen\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_closet\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tui: { label: \"Closets\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.closet\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_balcony\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tui: { label: \"Sacadas\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.balcony\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_ar_condicionado\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tui: { label: \"Ar condicionado\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.arCondicionado (quantidade)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_toilet\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tui: { label: \"Lavabos\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.toilet (separado de banheiros)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_floor\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"estrutura\"],\n\t\t\tui: { label: \"Tipo de piso\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.floor (ex: Porcelanato, Madeira)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_roof\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"estrutura\"],\n\t\t\tui: { label: \"Tipo de telhado\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.roof (ex: Cerâmico, Laje)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_ceiling\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"estrutura\"],\n\t\t\tui: { label: \"Tipo de forro\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.ceiling (ex: Gesso, PVC, Laje)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_paving\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"estrutura\"],\n\t\t\tui: { label: \"Pavimentação interna\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.paving (string livre, dados inconsistentes)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_pavement\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"estrutura\"],\n\t\t\tui: { label: \"Tipo de calçamento\" },\n\t\t\tenum: { COBBLESTONE: \"Paralelepípedo\", ASPHALT: \"Asfalto\", GRAVEL: \"Cascalho\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.pavement (enum: COBBLESTONE, ASPHALT, GRAVEL)\" },\n\t\t},\n\n\t\t// ========================================\n\t\t// security (booleans → array)\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"security\",\n\t\t\ttype: \"String[]\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tdb: { type: \"jsonb\", index: \"gin\" },\n\t\t\tui: { label: \"Segurança\" },\n\t\t\taudit: {\n\t\t\t\torigin: \"si9:property\",\n\t\t\t\tsource: \"security booleans true → labels PT-BR via SECURITY_LABELS (8 booleans)\",\n\t\t\t},\n\t\t},\n\n\t\t// ========================================\n\t\t// recreation (booleans → array) + recreation.* (enums)\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"recreation\",\n\t\t\ttype: \"String[]\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tdb: { type: \"jsonb\", index: \"gin\" },\n\t\t\tui: { label: \"Lazer\" },\n\t\t\taudit: {\n\t\t\t\torigin: \"si9:property\",\n\t\t\t\tsource: \"recreation booleans true → labels PT-BR via RECREATION_LABELS (9 booleans)\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"recreation_heating\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"estrutura\"],\n\t\t\tui: { label: \"Aquecimento\" },\n\t\t\tenum: { GAS: \"Gás\", SOLAR: \"Solar\", ELETRIC: \"Elétrico\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"recreation.heating (enum: GAS, SOLAR, ELETRIC)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"recreation_position_sun\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"estrutura\"],\n\t\t\tui: { label: \"Posição solar\" },\n\t\t\tenum: { NORTH: \"Norte\", SOUTH: \"Sul\", EAST: \"Leste\", WEST: \"Oeste\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"recreation.positionSun (enum: NORTH, SOUTH, EAST, WEST)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"recreation_position_court\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"estrutura\"],\n\t\t\tui: { label: \"Posição na quadra\" },\n\t\t\tenum: { MIDDLE_COURT: \"Meio de quadra\", CORNER: \"Esquina\", SUB_CORNER: \"Sub-esquina\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"recreation.positionCourt (enum: MIDDLE_COURT, CORNER, SUB_CORNER)\" },\n\t\t},\n\n\t\t// ========================================\n\t\t// rural (booleans → array) + rural.* (numbers/strings)\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"rural\",\n\t\t\ttype: \"String[]\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tdb: { type: \"jsonb\", index: \"gin\" },\n\t\t\tui: { label: \"Características rurais\" },\n\t\t\taudit: {\n\t\t\t\torigin: \"si9:property\",\n\t\t\t\tsource: \"rural booleans true → labels PT-BR via RURAL_LABELS (4 booleans: river, mine, hose, footballField)\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_bushels\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Sacas\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.bushels (capacidade produtiva)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_acre\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Alqueires\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.acre\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_pasture\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Pastagem\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.pasture (ex: formado, degradado)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_mechanized\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Mecanizada\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.mechanized (ex: total, parcial)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_reserve\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Reserva\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.reserve (hectares)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_pigsty\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Pocilgas\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.pigsty\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_aviary\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Aviários\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.aviary\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_weir\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Açudes\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.weir\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_wood_house\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Casas de madeira\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.woodHouse\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_brick_house\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Casas de alvenaria\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.brickHouse\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_mixed_house\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Casas mistas\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.mixedHouse\" },\n\t\t},\n\n\t\t// ========================================\n\t\t// fields (campos extras)\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"fields\",\n\t\t\ttype: \"Json\",\n\t\t\tcategories: [\"dados-extras\"],\n\t\t\tdb: { type: \"jsonb\" },\n\t\t\tui: { label: \"Campos extras\" },\n\t\t\taudit: {\n\t\t\t\torigin: \"si9:property\",\n\t\t\t\tsource: \"fields[] ({field, value} — campos personalizados criados pela imobiliária)\",\n\t\t\t},\n\t\t},\n\t],\n};\n\nexport default HorizonPropertySchemaBySi9;\n","import { z } from \"zod\"\nimport { HorizonPropertySchemaBaseZod } from \"@horizon-domains/property-model\"\n\n// ========================================\n// SCHEMAS DE MÍDIA (override para opcional)\n// ========================================\nconst ImageSchema = z\n .object({\n md: z.string().optional(),\n sm: z.string().optional(),\n full: z.string().optional(),\n cover: z.boolean().optional(),\n })\n .passthrough()\n\nconst VideoSchema = z\n .object({\n url: z.string().optional(),\n embed_url: z.string().optional(),\n })\n .passthrough()\n\nconst VirtualTourSchema = z\n .object({\n embed_url: z.string().optional(),\n })\n .passthrough()\n\nconst MainImageSchema = z\n .object({\n md: z.string().optional(),\n sm: z.string().optional(),\n full: z.string().optional(),\n })\n .passthrough()\n\n// ========================================\n// Schema Horizon para SI9 CRM\n// Todas as keys em snake_case minúsculo\n// Campos aninhados com prefixo do grupo (Regra 3+5)\n// ========================================\n\nexport const HorizonPropertySchemaBySi9Zod = HorizonPropertySchemaBaseZod\n .omit({ images: true, videos: true, virtual_tours: true, main_image: true })\n .extend({\n // Mídia (override mais flexível)\n images: z.array(ImageSchema).optional(),\n videos: z.array(VideoSchema).optional(),\n virtual_tours: z.array(VirtualTourSchema).optional(),\n main_image: MainImageSchema.optional(),\n\n // ========================================\n // SI9 EXTRAS — values.*\n // ========================================\n values_discount_value: z.number().min(0).optional(),\n values_fci_value: z.number().min(0).optional(),\n values_assigned_value: z.number().min(0).optional(),\n values_trash_fee: z.number().min(0).optional(),\n values_disaster_fee: z.number().min(0).optional(),\n\n // ========================================\n // SI9 EXTRAS — general_data.*\n // ========================================\n general_data_situation: z.string().optional(),\n general_data_board: z.string().optional(),\n general_data_allotment: z.string().optional(),\n\n // ========================================\n // SI9 EXTRAS — website.*\n // ========================================\n website_super_highlight: z.boolean().optional(),\n website_show_in_core: z.boolean().optional(),\n website_mcmv: z.boolean().optional(),\n\n // ========================================\n // SI9 EXTRAS — destination.*\n // ========================================\n destination_exchange: z.boolean().optional(),\n\n // ========================================\n // SI9 EXTRAS — location.* (complementar)\n // ========================================\n location_apartment: z.string().optional(),\n location_block: z.string().optional(),\n location_floor: z.string().optional(),\n location_quatrain: z.string().optional(),\n location_lot: z.string().optional(),\n\n // ========================================\n // SI9 EXTRAS — dimensions.*\n // ========================================\n dimensions_building_area: z.number().min(0).optional(),\n dimensions_land_area: z.number().min(0).optional(),\n dimensions_internal_area: z.number().min(0).optional(),\n dimensions_registered_area: z.number().min(0).optional(),\n dimensions_common_area: z.number().min(0).optional(),\n dimensions_garage_area: z.number().min(0).optional(),\n dimensions_front_size: z.number().min(0).optional(),\n dimensions_funds_size: z.number().min(0).optional(),\n dimensions_left_size: z.number().min(0).optional(),\n dimensions_right_size: z.number().min(0).optional(),\n\n // ========================================\n // SI9 EXTRAS — features (booleans → array)\n // ========================================\n features: z.array(z.string()).optional(),\n\n // ========================================\n // SI9 EXTRAS — features.* (numbers/strings)\n // ========================================\n features_room: z.number().optional(),\n features_kitchen: z.number().optional(),\n features_closet: z.number().optional(),\n features_balcony: z.number().optional(),\n features_ar_condicionado: z.number().optional(),\n features_toilet: z.number().optional(),\n features_floor: z.string().optional(),\n features_roof: z.string().optional(),\n features_ceiling: z.string().optional(),\n features_paving: z.string().optional(),\n features_pavement: z.string().optional(),\n\n // ========================================\n // SI9 EXTRAS — security (booleans → array)\n // ========================================\n security: z.array(z.string()).optional(),\n\n // ========================================\n // SI9 EXTRAS — recreation (booleans → array)\n // ========================================\n recreation: z.array(z.string()).optional(),\n\n // ========================================\n // SI9 EXTRAS — recreation.* (strings/enums)\n // ========================================\n recreation_heating: z.string().optional(),\n recreation_position_sun: z.string().optional(),\n recreation_position_court: z.string().optional(),\n\n // ========================================\n // SI9 EXTRAS — rural (booleans → array)\n // ========================================\n rural: z.array(z.string()).optional(),\n\n // ========================================\n // SI9 EXTRAS — rural.* (numbers/strings)\n // ========================================\n rural_bushels: z.number().optional(),\n rural_acre: z.number().optional(),\n rural_pasture: z.string().optional(),\n rural_mechanized: z.string().optional(),\n rural_reserve: z.number().optional(),\n rural_pigsty: z.number().optional(),\n rural_aviary: z.number().optional(),\n rural_weir: z.number().optional(),\n rural_wood_house: z.number().optional(),\n rural_brick_house: z.number().optional(),\n rural_mixed_house: z.number().optional(),\n\n // ========================================\n // SI9 EXTRAS — fields (campos extras)\n // ========================================\n fields: z\n .array(\n z.object({\n field: z.string(),\n value: z.string(),\n }),\n )\n .optional(),\n\n })\n .passthrough()\n\n// Tipo inferido\nexport type HorizonPropertySchemaBySi9Type = z.infer<\n typeof HorizonPropertySchemaBySi9Zod\n>\n\n// Helper de validação\nexport const validateHorizonPropertySchemaBySi9 = (\n data: unknown,\n): HorizonPropertySchemaBySi9Type => {\n return HorizonPropertySchemaBySi9Zod.parse(data)\n}\n\n// Helper de validação safe\nexport const safeValidateHorizonPropertySchemaBySi9 = (data: unknown) => {\n return HorizonPropertySchemaBySi9Zod.safeParse(data)\n}\n\n// Helper de validação parcial\nexport const validatePartialHorizonPropertySchemaBySi9 = (data: unknown) => {\n return HorizonPropertySchemaBySi9Zod.partial().parse(data)\n}\n"],"mappings":"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","names":["z"]}
1
+ {"version":3,"sources":["../src/schemas/si9-property-schema.zod.ts","../src/services/PropertyConverter/convertBaseFields.ts","../src/helpers/si9-labels.ts","../src/services/PropertyConverter/convertExtendedFields.ts","../src/services/PropertyConverter/index.ts","../src/services/PropertyDownloader.ts","../src/schemas/horizon-property-schema-by-si9.ts","../src/schemas/horizon-property-schema-by-si9.zod.ts"],"sourcesContent":["import { z } from \"zod\"\n\n// ========================================\n// Sub-schemas SI9\n// ========================================\n\nconst categorySchema = z\n .object({\n id: z.number().nullish(),\n name: z.string().nullish(),\n })\n .passthrough()\n\nconst generalDataSchema = z\n .object({\n board: z.string().nullish(),\n situation: z.string().nullish(),\n category: categorySchema.nullish(),\n description: z.string().nullish(),\n title: z.string().nullish(),\n allotment: z.string().nullish(),\n costCenter: z.string().nullish(),\n urlVideo: z.string().nullish(),\n urlTour: z.string().nullish(),\n })\n .passthrough()\n\nconst destinationSchema = z\n .object({\n sale: z.boolean().nullish(),\n rent: z.boolean().nullish(),\n season: z.boolean().nullish(),\n private: z.boolean().nullish(),\n application: z.boolean().nullish(),\n exchange: z.boolean().nullish(),\n })\n .passthrough()\n\nconst valuesSchema = z\n .object({\n saleValue: z.number().nullish(),\n rentValue: z.number().nullish(),\n discountValue: z.number().nullish(),\n fciValue: z.number().nullish(),\n iptuValue: z.number().nullish(),\n assignedValue: z.number().nullish(),\n trashFee: z.number().nullish(),\n disasterFee: z.number().nullish(),\n condominiumFee: z.number().nullish(),\n })\n .passthrough()\n\nconst citySchema = z\n .object({\n id: z.union([z.number(), z.null()]).nullish(),\n name: z.string().nullish(),\n state: z.string().nullish(),\n })\n .passthrough()\n\nconst districtSchema = z\n .object({\n id: z.union([z.number(), z.null()]).nullish(),\n name: z.string().nullish(),\n })\n .passthrough()\n\nconst locationSchema = z\n .object({\n city: citySchema.nullish(),\n address: z.string().nullish(),\n number: z.string().nullish(),\n zipCode: z.string().nullish(),\n district: districtSchema.nullish(),\n apartment: z.string().nullish(),\n block: z.string().nullish(),\n floor: z.string().nullish(),\n quatrain: z.string().nullish(),\n lot: z.string().nullish(),\n complement: z.string().nullish(),\n referencePoint: z.string().nullish(),\n longitude: z.string().nullish(),\n latitude: z.string().nullish(),\n blocksMap: z.unknown().nullish(),\n })\n .passthrough()\n\nconst websiteSchema = z\n .object({\n highlight: z.boolean().nullish(),\n superHighlight: z.boolean().nullish(),\n showInCore: z.boolean().nullish(),\n mcmv: z.boolean().nullish(),\n })\n .passthrough()\n\nconst dimensionsSchema = z\n .object({\n buildingArea: z.number().nullish(),\n landArea: z.number().nullish(),\n usefulArea: z.number().nullish(),\n privateArea: z.number().nullish(),\n internalArea: z.number().nullish(),\n registeredArea: z.number().nullish(),\n totalArea: z.number().nullish(),\n commonArea: z.number().nullish(),\n garageArea: z.number().nullish(),\n frontSize: z.number().nullish(),\n fundsSize: z.number().nullish(),\n leftSize: z.number().nullish(),\n rightSize: z.number().nullish(),\n })\n .passthrough()\n\nconst featuresSchema = z\n .object({\n // Numéricos\n room: z.number().nullish(),\n kitchen: z.number().nullish(),\n bedroom: z.number().nullish(),\n suite: z.number().nullish(),\n closet: z.number().nullish(),\n bathroom: z.number().nullish(),\n toilet: z.number().nullish(),\n balcony: z.number().nullish(),\n coveredGarage: z.number().nullish(),\n outdoorGarage: z.number().nullish(),\n arCondicionado: z.number().nullish(),\n\n // Acabamentos (string/enum)\n floor: z.string().nullish(),\n roof: z.string().nullish(),\n ceiling: z.string().nullish(),\n paving: z.string().nullish(),\n pavement: z.string().nullish(),\n\n // Booleans\n shed: z.boolean().nullish(),\n needMaid: z.boolean().nullish(),\n serviceArea: z.boolean().nullish(),\n pantry: z.boolean().nullish(),\n furnished: z.boolean().nullish(),\n semiFurnished: z.boolean().nullish(),\n wineHouse: z.boolean().nullish(),\n fittedKitchen: z.boolean().nullish(),\n kennel: z.boolean().nullish(),\n waterTank: z.boolean().nullish(),\n barbecueGrill: z.boolean().nullish(),\n telephone: z.boolean().nullish(),\n porchWithGrill: z.boolean().nullish(),\n elevator: z.boolean().nullish(),\n porch: z.boolean().nullish(),\n winterGarden: z.boolean().nullish(),\n penthouseApartment: z.boolean().nullish(),\n highStandard: z.boolean().nullish(),\n release: z.boolean().nullish(),\n condominium: z.boolean().nullish(),\n inPlant: z.boolean().nullish(),\n coast: z.boolean().nullish(),\n serviceBathroom: z.boolean().nullish(),\n lounge: z.boolean().nullish(),\n onlineConcierge: z.boolean().nullish(),\n demiSuite: z.boolean().nullish(),\n newOrSemiNew: z.boolean().nullish(),\n })\n .passthrough()\n\nconst securitySchema = z\n .object({\n alarm: z.boolean().nullish(),\n electricFence: z.boolean().nullish(),\n intercom: z.boolean().nullish(),\n concierge: z.boolean().nullish(),\n walled: z.boolean().nullish(),\n gate: z.boolean().nullish(),\n electronicGate: z.boolean().nullish(),\n protectionGrid: z.boolean().nullish(),\n })\n .passthrough()\n\nconst recreationSchema = z\n .object({\n playgroud: z.boolean().nullish(), // typo da SI9 (sem \"n\")\n sauna: z.boolean().nullish(),\n pool: z.boolean().nullish(),\n gym: z.boolean().nullish(),\n fireplace: z.boolean().nullish(),\n gourmetSpace: z.boolean().nullish(),\n multisportCourt: z.boolean().nullish(),\n partyRoom: z.boolean().nullish(),\n whirlpool: z.boolean().nullish(),\n heating: z.string().nullish(),\n positionSun: z.string().nullish(),\n positionCourt: z.string().nullish(),\n })\n .passthrough()\n\nconst ruralSchema = z\n .object({\n river: z.boolean().nullish(),\n mine: z.boolean().nullish(),\n hose: z.boolean().nullish(),\n footballField: z.boolean().nullish(),\n bushels: z.number().nullish(),\n acre: z.number().nullish(),\n pasture: z.string().nullish(),\n mechanized: z.string().nullish(),\n reserve: z.number().nullish(),\n pigsty: z.number().nullish(),\n aviary: z.number().nullish(),\n weir: z.number().nullish(),\n woodHouse: z.number().nullish(),\n brickHouse: z.number().nullish(),\n mixedHouse: z.number().nullish(),\n })\n .passthrough()\n\nconst companySchema = z\n .object({\n id: z.number().nullish(),\n fancyName: z.string().nullish(),\n corporateName: z.string().nullish(),\n address: z.string().nullish(),\n phoneNumber: z.string().nullish(),\n siteUrl: z.string().nullish(),\n })\n .passthrough()\n\nconst imageSchema = z\n .object({\n url: z.string().nullish(),\n subtitle: z.string().nullish(),\n displaySite: z.boolean().nullish(),\n pic360: z.union([z.boolean(), z.string()]).nullish(),\n })\n .passthrough()\n\nconst fieldSchema = z\n .object({\n field: z.string().nullish(),\n value: z.unknown().nullish(),\n })\n .passthrough()\n\n// ========================================\n// Schema principal SI9\n// ========================================\n\nconst brokerSchema = z\n .object({\n id: z.number().nullish(),\n name: z.string().nullish(),\n cellphone: z.string().nullish(),\n photoUrl: z.string().nullish(),\n creci: z.string().nullish(),\n })\n .passthrough()\n\nexport const Si9PropertySchemaZod = z\n .object({\n id: z.number(),\n generalData: generalDataSchema.nullish(),\n destination: destinationSchema.nullish(),\n values: valuesSchema.nullish(),\n location: locationSchema.nullish(),\n website: websiteSchema.nullish(),\n dimensions: dimensionsSchema.nullish(),\n features: featuresSchema.nullish(),\n security: securitySchema.nullish(),\n recreation: recreationSchema.nullish(),\n rural: ruralSchema.nullish(),\n company: companySchema.nullish(),\n broker: brokerSchema.nullish(),\n images: z.array(imageSchema).nullish(),\n fields: z.array(fieldSchema).nullish(),\n })\n .passthrough()\n\n// Tipo inferido\nexport type Si9PropertySchema = z.infer<typeof Si9PropertySchemaZod>\n\n// Helper de validação\nexport const validateSi9PropertySchema = (data: unknown): Si9PropertySchema => {\n return Si9PropertySchemaZod.parse(data)\n}\n\n// Helper de validação safe\nexport const safeValidateSi9PropertySchema = (data: unknown) => {\n return Si9PropertySchemaZod.safeParse(data)\n}\n","import type { Si9PropertySchema } from \"../../schemas/si9-property-schema.zod\"\nimport type { HorizonPropertySchemaBySi9Type } from \"../../schemas/horizon-property-schema-by-si9.zod\"\n\n/**\n * Mapa de chaves reconhecidas nos fields customizados\n * Nomes em português legível (aparecem nos portais)\n */\nconst FIELDS_RECONHECIDOS: Record<\n string,\n (result: Partial<HorizonPropertySchemaBySi9Type>, value: string) => void\n> = {\n \"Geolocalização aproximada\": (result, _value) => {\n // geo_aproximado é objeto { lat, lng } — só pode ser preenchido se já tiver lat/lng\n // Será tratado após o processamento de coordenadas\n },\n}\n\n/**\n * Converte campos do schema base Horizon (campos padrão que existem em todos os property models)\n * Conforme PLANO_CONVERSOR.md\n */\nexport function convertBaseFields(\n imovel: Si9PropertySchema,\n): Partial<HorizonPropertySchemaBySi9Type> {\n const result: Partial<HorizonPropertySchemaBySi9Type> = {}\n\n // ========== IDENTIFICAÇÃO BÁSICA ==========\n result.reference = String(imovel.id)\n result.title = imovel.generalData?.title || \"Sem título\"\n result.description = imovel.generalData?.description || \"Sem descrição\"\n\n // SI9 não tem campo de data de atualização — usar data da sincronização\n result.source_updated_at = new Date().toISOString()\n\n // source_published_at: deixar vazio (CRM tem dtCadastro mas API não expõe)\n\n // ========== CONFIGURAÇÕES ==========\n result.currency = \"BRL\"\n result.unit_area = \"m2\"\n result.unit_distance = \"meters\"\n\n // ========== OPERAÇÃO ==========\n const dest = imovel.destination\n if (dest) {\n const operacao: (\"venda\" | \"locacao\" | \"temporada\")[] = []\n if (dest.sale) operacao.push(\"venda\")\n if (dest.rent) operacao.push(\"locacao\")\n if (dest.season) operacao.push(\"temporada\")\n if (operacao.length > 0) result.operacao = operacao\n }\n\n // ========== TIPO ==========\n if (imovel.generalData?.category?.name) {\n result.tipo = imovel.generalData.category.name\n }\n\n // ========== VALORES MONETÁRIOS ==========\n // Valores em REAIS (R$) — NÃO dividir por 100\n const values = imovel.values\n if (values) {\n if (values.saleValue && values.saleValue > 0 && imovel.destination?.sale) {\n result.valor_venda = values.saleValue\n }\n if (values.rentValue && values.rentValue > 0 && imovel.destination?.rent) {\n result.valor_locacao = values.rentValue\n }\n if (values.condominiumFee && values.condominiumFee > 0) {\n result.valor_condominio = values.condominiumFee\n }\n if (values.iptuValue && values.iptuValue > 0) {\n result.valor_iptu = values.iptuValue\n }\n }\n\n // ========== ÁREAS ==========\n const dim = imovel.dimensions\n if (dim) {\n if (dim.totalArea && dim.totalArea > 0) result.area_total = dim.totalArea\n if (dim.privateArea && dim.privateArea > 0)\n result.area_privativa = dim.privateArea\n if (dim.usefulArea && dim.usefulArea > 0) result.area_util = dim.usefulArea\n }\n\n // ========== DEPENDÊNCIAS (features numéricos) ==========\n const feat = imovel.features\n if (feat) {\n if (feat.bedroom && feat.bedroom > 0) result.dormitorios = feat.bedroom\n if (feat.suite && feat.suite > 0) result.suites = feat.suite\n\n // Banheiros = só bathroom (toilet/lavabo vai como campo extra separado)\n if (feat.bathroom && feat.bathroom > 0) result.banheiros = feat.bathroom\n\n // Garagens = coveredGarage + outdoorGarage\n const covered = feat.coveredGarage || 0\n const outdoor = feat.outdoorGarage || 0\n const totalGaragens = covered + outdoor\n if (totalGaragens > 0) result.vagas_garagem = totalGaragens\n }\n\n // ========== ENDEREÇO ==========\n const loc = imovel.location\n if (loc) {\n // CEP: formatar 00000-000\n if (loc.zipCode) {\n const cepLimpo = loc.zipCode.replace(/\\D/g, \"\")\n if (cepLimpo.length === 8) {\n result.endereco_cep = `${cepLimpo.slice(0, 5)}-${cepLimpo.slice(5)}`\n } else {\n result.endereco_cep = loc.zipCode\n }\n }\n\n if (loc.city?.state) result.endereco_estado = loc.city.state\n if (loc.city?.name) result.endereco_cidade = loc.city.name\n if (loc.district?.name) result.endereco_bairro = loc.district.name\n if (loc.address) result.endereco_logradouro = loc.address\n if (loc.number) result.endereco_numero = loc.number\n if (loc.complement) result.endereco_complemento = loc.complement\n if (loc.referencePoint) result.endereco_referencia = loc.referencePoint\n\n // Coordenadas (vem como string, converter para number)\n if (loc.latitude && loc.longitude) {\n const lat = Number(loc.latitude)\n const lng = Number(loc.longitude)\n if (!isNaN(lat) && !isNaN(lng) && lat !== 0 && lng !== 0) {\n result.lat = lat\n result.lng = lng\n }\n }\n }\n\n // ========== CORRETOR (broker nativo da API) ==========\n if (imovel.broker?.id) {\n result.corretor_key = String(imovel.broker.id)\n }\n if (imovel.broker?.name) {\n result.corretor_nome = imovel.broker.name\n }\n\n // ========== CONDOMÍNIO ==========\n if (imovel.generalData?.allotment) {\n result.condominio_nome = imovel.generalData.allotment\n }\n\n // ========== DESTAQUE ==========\n if (imovel.website?.highlight || imovel.website?.superHighlight) {\n result.destaque = true\n }\n\n // ========== IMAGENS ==========\n if (imovel.images && imovel.images.length > 0) {\n // Filtrar apenas imagens com displaySite=true (ou sem a flag)\n const visibleImages = imovel.images.filter(\n (img) => img.displaySite !== false && img.url,\n )\n\n result.images = visibleImages.map((img, index) => ({\n full: img.url || \"\",\n md: img.url || \"\",\n sm: img.url || \"\",\n cover: index === 0,\n }))\n\n // Main image = primeira imagem\n if (visibleImages.length > 0 && visibleImages[0].url) {\n result.main_image = {\n full: visibleImages[0].url,\n md: visibleImages[0].url,\n sm: visibleImages[0].url,\n }\n }\n } else {\n result.images = []\n }\n\n // ========== VÍDEOS ==========\n if (imovel.generalData?.urlVideo) {\n const url = imovel.generalData.urlVideo\n result.videos = [\n {\n url,\n embed_url: url,\n },\n ]\n } else {\n result.videos = []\n }\n\n // ========== TOURS VIRTUAIS ==========\n if (imovel.generalData?.urlTour) {\n result.virtual_tours = [\n {\n embed_url: imovel.generalData.urlTour,\n },\n ]\n } else {\n result.virtual_tours = []\n }\n\n // ========== SEO ==========\n // Não fabricar fallbacks — se o CRM não tem SEO nativo, fica vazio\n // O front-end resolve na hora de renderizar\n\n // ========== FIELDS → chaves reconhecidas ==========\n const fields = imovel.fields\n if (fields && fields.length > 0) {\n // Chaves reconhecidas: copiar pra campos Horizon\n for (const f of fields) {\n if (!f.field) continue\n const handler = FIELDS_RECONHECIDOS[String(f.field)]\n if (handler) {\n handler(result, String(f.value || \"\"))\n }\n }\n\n // geo_aproximado: se \"Geolocalização aproximada\" existe E temos lat/lng\n const hasGeoField = fields.some(\n (f) => String(f.field) === \"Geolocalização aproximada\",\n )\n if (hasGeoField && result.lat && result.lng) {\n result.geo_aproximado = {\n lat: result.lat,\n lng: result.lng,\n }\n }\n }\n\n return result\n}\n","/**\n * Mapas de tradução boolean → label PT-BR para campos da SI9\n * Converte campos booleanos `true` em arrays de strings descritivas\n */\n\n// ========================================\n// Features (características do imóvel)\n// ========================================\nexport const FEATURES_LABELS: Record<string, string> = {\n shed: \"Galpão\",\n needMaid: \"Dependência de empregada\",\n serviceArea: \"Área de serviço\",\n pantry: \"Despensa\",\n furnished: \"Mobiliado\",\n semiFurnished: \"Semi-mobiliado\",\n wineHouse: \"Adega\",\n fittedKitchen: \"Cozinha planejada\",\n kennel: \"Canil\",\n waterTank: \"Cisterna\",\n barbecueGrill: \"Churrasqueira\",\n telephone: \"Telefone\",\n porchWithGrill: \"Varanda gourmet\",\n elevator: \"Elevador\",\n porch: \"Varanda\",\n winterGarden: \"Jardim de inverno\",\n penthouseApartment: \"Cobertura\",\n highStandard: \"Alto padrão\",\n release: \"Lançamento\",\n condominium: \"Condomínio\",\n inPlant: \"Na planta\",\n coast: \"Litoral\",\n serviceBathroom: \"Banheiro de serviço\",\n lounge: \"Sala de estar\",\n onlineConcierge: \"Portaria online\",\n demiSuite: \"Demi-suíte\",\n newOrSemiNew: \"Novo ou seminovo\",\n}\n\n// ========================================\n// Security (segurança)\n// ========================================\nexport const SECURITY_LABELS: Record<string, string> = {\n alarm: \"Alarme\",\n electricFence: \"Cerca elétrica\",\n intercom: \"Interfone\",\n concierge: \"Portaria\",\n walled: \"Murado\",\n gate: \"Portão\",\n electronicGate: \"Portão eletrônico\",\n protectionGrid: \"Grade de proteção\",\n}\n\n// ========================================\n// Recreation (lazer)\n// ========================================\nexport const RECREATION_LABELS: Record<string, string> = {\n playgroud: \"Playground\", // typo da SI9 (sem \"n\")\n sauna: \"Sauna\",\n pool: \"Piscina\",\n gym: \"Academia\",\n fireplace: \"Lareira\",\n gourmetSpace: \"Espaço gourmet\",\n multisportCourt: \"Quadra poliesportiva\",\n partyRoom: \"Salão de festas\",\n whirlpool: \"Hidromassagem\",\n}\n\n// ========================================\n// Rural (características rurais)\n// ========================================\nexport const RURAL_LABELS: Record<string, string> = {\n river: \"Rio\",\n mine: \"Mina\",\n hose: \"Mangueira\",\n footballField: \"Campo de futebol\",\n}\n\n// ========================================\n// Enums (campos string com valores fixos)\n// ========================================\n\nexport const SITUATION_LABELS: Record<string, string> = {\n AVALIABLE: \"Disponível\",\n INACTIVE: \"Inativo\",\n RENTED: \"Alugado\",\n RESERVED: \"Reservado\",\n SOLD: \"Vendido\",\n INVOICE: \"Em faturamento\",\n TODOCUMENT: \"Em documentação\",\n DELETE: \"Excluído\",\n TERMINATION: \"Rescisão\",\n RENOVATION: \"Em reforma\",\n}\n\nexport const HEATING_LABELS: Record<string, string> = {\n GAS: \"Gás\",\n SOLAR: \"Solar\",\n ELETRIC: \"Elétrico\",\n}\n\nexport const POSITION_SUN_LABELS: Record<string, string> = {\n NORTH: \"Norte\",\n SOUTH: \"Sul\",\n EAST: \"Leste\",\n WEST: \"Oeste\",\n}\n\nexport const POSITION_COURT_LABELS: Record<string, string> = {\n MIDDLE_COURT: \"Meio de quadra\",\n CORNER: \"Esquina\",\n SUB_CORNER: \"Sub-esquina\",\n}\n\nexport const PAVEMENT_LABELS: Record<string, string> = {\n COBBLESTONE: \"Paralelepípedo\",\n ASPHALT: \"Asfalto\",\n GRAVEL: \"Cascalho\",\n}\n\n// ========================================\n// Helpers\n// ========================================\n\n/**\n * Traduz um valor de enum usando mapa de labels\n * Retorna o valor original se não encontrar tradução\n */\nexport function enumToLabel(\n value: string | null | undefined,\n labelMap: Record<string, string>,\n): string | null {\n if (!value) return null\n return labelMap[value] ?? value\n}\n\n// ========================================\n// Helper genérico\n// ========================================\n\n/**\n * Converte um objeto com campos booleanos em um array de labels PT-BR\n * Filtra apenas os campos que são `true` (ignora false/null/undefined)\n *\n * @param obj Objeto com campos booleanos (ex: features, security, recreation)\n * @param labelMap Mapa de tradução (ex: FEATURES_LABELS)\n * @returns Array de labels em PT-BR\n */\nexport function booleanFieldsToLabels(\n obj: Record<string, unknown> | null | undefined,\n labelMap: Record<string, string>,\n): string[] {\n if (!obj) return []\n\n const labels: string[] = []\n\n for (const [key, label] of Object.entries(labelMap)) {\n if (obj[key] === true) {\n labels.push(label)\n }\n }\n\n return labels\n}\n","import type { Si9PropertySchema } from \"../../schemas/si9-property-schema.zod\"\nimport type { HorizonPropertySchemaBySi9Type } from \"../../schemas/horizon-property-schema-by-si9.zod\"\nimport {\n FEATURES_LABELS,\n SECURITY_LABELS,\n RECREATION_LABELS,\n RURAL_LABELS,\n SITUATION_LABELS,\n HEATING_LABELS,\n POSITION_SUN_LABELS,\n POSITION_COURT_LABELS,\n PAVEMENT_LABELS,\n booleanFieldsToLabels,\n enumToLabel,\n} from \"../../helpers/si9-labels\"\n\n/**\n * Converte campos específicos do SI9 (não existem no schema base Horizon)\n *\n * Convenção (Regras de Normalização):\n * - Regra 3: campos aninhados ganham prefixo do grupo (dimensions_, features_, etc.)\n * - Regra 4: booleans agrupados viram array (features, security, recreation, rural)\n * - Regra 5: tudo snake_case minúsculo\n */\nexport function convertExtendedFields(\n imovel: Si9PropertySchema,\n): Partial<HorizonPropertySchemaBySi9Type> {\n const result: Partial<HorizonPropertySchemaBySi9Type> = {}\n\n // ========== values.* ==========\n const values = imovel.values\n if (values) {\n if (values.discountValue && values.discountValue > 0)\n result.values_discount_value = values.discountValue\n if (values.fciValue && values.fciValue > 0)\n result.values_fci_value = values.fciValue\n if (values.assignedValue && values.assignedValue > 0)\n result.values_assigned_value = values.assignedValue\n if (values.trashFee && values.trashFee > 0)\n result.values_trash_fee = values.trashFee\n if (values.disasterFee && values.disasterFee > 0)\n result.values_disaster_fee = values.disasterFee\n }\n\n // ========== general_data.* ==========\n const ACCEPTED_SITUATIONS = [\"SOLD\", \"RENTED\", \"RESERVED\"]\n if (imovel.generalData?.situation && ACCEPTED_SITUATIONS.includes(imovel.generalData.situation))\n result.general_data_situation = imovel.generalData.situation\n if (imovel.generalData?.board)\n result.general_data_board = imovel.generalData.board\n // general_data_allotment REMOVIDO — já vai pro condominio_nome no base\n\n // ========== website.* ==========\n if (imovel.website?.superHighlight === true)\n result.website_super_highlight = true\n if (imovel.website?.showInCore === true)\n result.website_show_in_core = true\n if (imovel.website?.mcmv === true)\n result.website_mcmv = true\n\n // ========== destination.* ==========\n if (imovel.destination?.exchange === true)\n result.destination_exchange = true\n\n // ========== location.* (complementar) ==========\n const loc = imovel.location\n if (loc) {\n if (loc.apartment) result.location_apartment = loc.apartment\n if (loc.block) result.location_block = loc.block\n if (loc.floor) result.location_floor = loc.floor\n if (loc.quatrain) result.location_quatrain = loc.quatrain\n if (loc.lot) result.location_lot = loc.lot\n }\n\n // ========== dimensions.* ==========\n const dim = imovel.dimensions\n if (dim) {\n if (dim.buildingArea && dim.buildingArea > 0)\n result.dimensions_building_area = dim.buildingArea\n if (dim.landArea && dim.landArea > 0)\n result.dimensions_land_area = dim.landArea\n if (dim.internalArea && dim.internalArea > 0)\n result.dimensions_internal_area = dim.internalArea\n if (dim.registeredArea && dim.registeredArea > 0)\n result.dimensions_registered_area = dim.registeredArea\n if (dim.commonArea && dim.commonArea > 0)\n result.dimensions_common_area = dim.commonArea\n if (dim.garageArea && dim.garageArea > 0)\n result.dimensions_garage_area = dim.garageArea\n if (dim.frontSize && dim.frontSize > 0)\n result.dimensions_front_size = dim.frontSize\n if (dim.fundsSize && dim.fundsSize > 0)\n result.dimensions_funds_size = dim.fundsSize\n if (dim.leftSize && dim.leftSize > 0)\n result.dimensions_left_size = dim.leftSize\n if (dim.rightSize && dim.rightSize > 0)\n result.dimensions_right_size = dim.rightSize\n }\n\n // ========== features (booleans → array) ==========\n const feat = imovel.features\n const features = booleanFieldsToLabels(\n feat as Record<string, unknown> | undefined,\n FEATURES_LABELS,\n )\n if (features.length > 0) result.features = features\n\n // ========== features.* (numbers/strings) ==========\n if (feat) {\n if (feat.room && feat.room > 0) result.features_room = feat.room\n if (feat.kitchen && feat.kitchen > 0) result.features_kitchen = feat.kitchen\n if (feat.closet && feat.closet > 0) result.features_closet = feat.closet\n if (feat.balcony && feat.balcony > 0) result.features_balcony = feat.balcony\n if (feat.arCondicionado && feat.arCondicionado > 0)\n result.features_ar_condicionado = feat.arCondicionado\n if (feat.toilet && feat.toilet > 0) result.features_toilet = feat.toilet\n if (feat.floor) result.features_floor = feat.floor\n if (feat.roof) result.features_roof = feat.roof\n if (feat.ceiling) result.features_ceiling = feat.ceiling\n if (feat.paving) result.features_paving = feat.paving\n if (feat.pavement) result.features_pavement = feat.pavement\n }\n\n // ========== security (booleans → array) ==========\n const security = booleanFieldsToLabels(\n imovel.security as Record<string, unknown> | undefined,\n SECURITY_LABELS,\n )\n if (security.length > 0) result.security = security\n\n // ========== recreation (booleans → array) ==========\n const recreation = booleanFieldsToLabels(\n imovel.recreation as Record<string, unknown> | undefined,\n RECREATION_LABELS,\n )\n if (recreation.length > 0) result.recreation = recreation\n\n // ========== recreation.* (enums) ==========\n if (imovel.recreation?.heating)\n result.recreation_heating = imovel.recreation.heating\n if (imovel.recreation?.positionSun)\n result.recreation_position_sun = imovel.recreation.positionSun\n if (imovel.recreation?.positionCourt)\n result.recreation_position_court = imovel.recreation.positionCourt\n\n // ========== rural (booleans → array) ==========\n const rural = imovel.rural\n if (rural) {\n const ruralLabels = booleanFieldsToLabels(\n rural as Record<string, unknown>,\n RURAL_LABELS,\n )\n if (ruralLabels.length > 0) result.rural = ruralLabels\n\n // rural.* (numbers/strings)\n if (rural.bushels && rural.bushels > 0) result.rural_bushels = rural.bushels\n if (rural.acre && rural.acre > 0) result.rural_acre = rural.acre\n if (rural.pasture) result.rural_pasture = rural.pasture\n if (rural.mechanized) result.rural_mechanized = rural.mechanized\n if (rural.reserve && rural.reserve > 0) result.rural_reserve = rural.reserve\n if (rural.pigsty && rural.pigsty > 0) result.rural_pigsty = rural.pigsty\n if (rural.aviary && rural.aviary > 0) result.rural_aviary = rural.aviary\n if (rural.weir && rural.weir > 0) result.rural_weir = rural.weir\n if (rural.woodHouse && rural.woodHouse > 0)\n result.rural_wood_house = rural.woodHouse\n if (rural.brickHouse && rural.brickHouse > 0)\n result.rural_brick_house = rural.brickHouse\n if (rural.mixedHouse && rural.mixedHouse > 0)\n result.rural_mixed_house = rural.mixedHouse\n }\n\n // ========== fields (campos extras) ==========\n const fields = imovel.fields\n if (fields && fields.length > 0) {\n const fieldsFormatados = fields\n .filter((f) => f.field)\n .map((f) => ({\n field: String(f.field),\n value: String(f.value || \"\"),\n }))\n if (fieldsFormatados.length > 0) result.fields = fieldsFormatados\n }\n\n return result\n}\n","import { safeValidateSi9PropertySchema } from \"../../schemas/si9-property-schema.zod\"\nimport type { HorizonPropertySchemaBySi9Type } from \"../../schemas/horizon-property-schema-by-si9.zod\"\nimport { convertBaseFields } from \"./convertBaseFields\"\nimport { convertExtendedFields } from \"./convertExtendedFields\"\n\n/**\n * Converte um imóvel do formato SI9 para o formato Horizon Property\n *\n * Dividido em duas partes:\n * 1. Base Fields: campos que existem no horizon-property-schema-base\n * 2. Extended Fields: campos específicos do SI9 (não existem no schema base)\n */\nexport function convertSi9PropertyToHorizon(\n rawImovel: unknown,\n): HorizonPropertySchemaBySi9Type {\n // Validar entrada com Zod (safe parse)\n const validation = safeValidateSi9PropertySchema(rawImovel)\n\n if (!validation.success) {\n const errors = validation.error.issues\n .map((i) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\"; \")\n throw new Error(`Validação SI9 falhou: ${errors}`)\n }\n\n const imovel = validation.data\n\n // Converter campos base + estendidos\n const baseFields = convertBaseFields(imovel)\n const extendedFields = convertExtendedFields(imovel)\n\n // Combinar\n const result = {\n ...baseFields,\n ...extendedFields,\n }\n\n return result as HorizonPropertySchemaBySi9Type\n}\n\n// Re-exportar as funções individuais\nexport { convertBaseFields } from \"./convertBaseFields\"\nexport { convertExtendedFields } from \"./convertExtendedFields\"\n","import { promises as fs } from \"fs\"\nimport { join } from \"path\"\n\n// ========== TIPOS ==========\n\nexport interface SI9Credentials {\n\tusername: string\n\tpassword: string\n\tauthorization: string\n}\n\nexport interface PropertyDownloaderConfig {\n\tcredentials: SI9Credentials\n\toutputDir: string\n\tbaseUrl?: string\n}\n\nexport interface DownloadResult {\n\ttotalItems: number\n\tdownloadedItems: number\n\terrors: string[]\n}\n\ninterface TokenResponse {\n\taccess_token: string\n\trefresh_token: string\n\ttoken_type: string\n\texpires_in: number\n}\n\n// ========== CREDENCIAIS PADRÃO (conta Ghisi) ==========\n\nexport const SI9_DEFAULT_CREDENTIALS: SI9Credentials = {\n\tusername: \"ghisi-api\",\n\tpassword: \"y6HyTKxAZ40tx8D8w%5E3)\",\n\tauthorization: \"ZDc3ZmYyMzUtNmEyNS00YzE3LWI4NDktNjM3NWQ2NGM0ZTVhOmI2ZDhhMTgxLTQ5OWEtNGRjNi1hNGU0LTlkZTUxZjNjMDE5Nw==\",\n}\n\n// ========== DOWNLOADER ==========\n\nexport class PropertyDownloader {\n\tprivate credentials: SI9Credentials\n\tprivate baseUrl: string\n\tprivate outputDir: string\n\tprivate token: string | null = null\n\tprivate tokenExpiresAt: number = 0\n\n\tconstructor(config: PropertyDownloaderConfig) {\n\t\tthis.credentials = config.credentials\n\t\tthis.baseUrl = config.baseUrl || \"https://api.si9sistemas.com.br/imobilsi9-api\"\n\t\tthis.outputDir = config.outputDir\n\t}\n\n\t/**\n\t * Autentica via OAuth 2.0 Password Grant\n\t * IMPORTANTE: NÃO enviar Content-Type no auth (causa 500 na API)\n\t */\n\tprivate async authenticate(): Promise<TokenResponse> {\n\t\tconst url =\n\t\t\t`${this.baseUrl}/oauth/token?grant_type=password` +\n\t\t\t`&username=${this.credentials.username}` +\n\t\t\t`&password=${this.credentials.password}`\n\n\t\tconsole.log(`🔐 Autenticando na SI9...`)\n\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Basic ${this.credentials.authorization}`,\n\t\t\t},\n\t\t})\n\n\t\tif (!response.ok) {\n\t\t\tconst errorText = await response.text()\n\t\t\tthrow new Error(`Erro de autenticação ${response.status}: ${errorText}`)\n\t\t}\n\n\t\tconst data = (await response.json()) as TokenResponse\n\t\tconsole.log(`✅ Token obtido (expira em ${data.expires_in}s)`)\n\t\treturn data\n\t}\n\n\t/**\n\t * Garante que o token está válido, renovando se necessário\n\t * Margem de segurança: renova 60s antes de expirar\n\t */\n\tprivate async ensureToken(): Promise<void> {\n\t\tif (this.token && Date.now() < this.tokenExpiresAt) return\n\n\t\tconst auth = await this.authenticate()\n\t\tthis.token = auth.access_token\n\t\tthis.tokenExpiresAt = Date.now() + auth.expires_in * 1000 - 60000\n\t}\n\n\t/**\n\t * Busca todos os imóveis (SI9 não tem paginação)\n\t */\n\tprivate async getProperties(): Promise<any[]> {\n\t\tawait this.ensureToken()\n\n\t\tconst url = `${this.baseUrl}/property`\n\t\tconsole.log(`🔗 Requisição: GET ${url}`)\n\n\t\tconst response = await fetch(url, {\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Bearer ${this.token}`,\n\t\t\t},\n\t\t})\n\n\t\tif (!response.ok) {\n\t\t\tconst errorText = await response.text()\n\t\t\tthrow new Error(`Erro ${response.status}: ${errorText}`)\n\t\t}\n\n\t\treturn (await response.json()) as any[]\n\t}\n\n\tprivate async ensureOutputDir(): Promise<void> {\n\t\ttry {\n\t\t\tawait fs.access(this.outputDir)\n\t\t} catch {\n\t\t\tawait fs.mkdir(this.outputDir, { recursive: true })\n\t\t}\n\t}\n\n\t/**\n\t * Baixa TODOS os imóveis e salva em arquivo único\n\t * (SI9 não tem paginação — retorna tudo de uma vez)\n\t */\n\tasync downloadAll(): Promise<DownloadResult> {\n\t\tawait this.ensureOutputDir()\n\n\t\tconst errors: string[] = []\n\t\tlet downloadedItems = 0\n\n\t\tconsole.log(`🚀 Iniciando download completo da API SI9...`)\n\t\tconsole.log(`📁 Salvando em: ${this.outputDir}`)\n\n\t\ttry {\n\t\t\tconst properties = await this.getProperties()\n\n\t\t\tif (!Array.isArray(properties)) {\n\t\t\t\tthrow new Error(`Resposta inesperada: esperava array, recebeu ${typeof properties}`)\n\t\t\t}\n\n\t\t\tdownloadedItems = properties.length\n\t\t\tconsole.log(`📊 Recebidos: ${downloadedItems} imóveis`)\n\n\t\t\tif (downloadedItems > 0) {\n\t\t\t\tconst filePath = join(this.outputDir, \"all-properties.json\")\n\t\t\t\tawait fs.writeFile(filePath, JSON.stringify(properties, null, 2), \"utf8\")\n\t\t\t\tconsole.log(`✅ Salvo em: all-properties.json`)\n\t\t\t} else {\n\t\t\t\tconsole.log(`⚠️ Nenhum imóvel retornado (array vazio)`)\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconst errorMsg = `Erro no download: ${error instanceof Error ? error.message : String(error)}`\n\t\t\terrors.push(errorMsg)\n\t\t\tconsole.error(`❌ ${errorMsg}`)\n\t\t}\n\n\t\t// Resumo final\n\t\tconsole.log(`\\n📊 RESUMO DO DOWNLOAD:`)\n\t\tconsole.log(`✅ Propriedades baixadas: ${downloadedItems}`)\n\t\tif (errors.length > 0) {\n\t\t\tconsole.log(`❌ Erros: ${errors.length}`)\n\t\t\terrors.forEach((err) => console.log(` - ${err}`))\n\t\t}\n\n\t\treturn {\n\t\t\ttotalItems: downloadedItems,\n\t\t\tdownloadedItems,\n\t\t\terrors,\n\t\t}\n\t}\n}\n","/**\n * SI9 Extended Schema - v3.1.0\n *\n * Schema estendido do Horizon Base com campos específicos do SI9 CRM\n * Todas as keys em snake_case minúsculo (Regra 5)\n * Campos aninhados com prefixo do grupo (Regra 3)\n * Cada campo tem audit.source descrevendo a origem no CRM\n */\n\nimport type { EntitySchema } from \"@horizon-domains/property-model\";\nimport { horizonPropertySchemaBase } from \"@horizon-domains/property-model\";\n\n/**\n * Mapa de source para os 45 campos base do Horizon\n * Descreve de onde cada campo foi captado na API SI9\n */\nconst BASE_SOURCE_MAP: Record<string, string> = {\n\t// Sistema\n\tsource_published_at: \"(Vazio - não disponível na API)\",\n\tsource_updated_at: \"gerado com new Date().toISOString()\",\n\tcurrency: \"fixo 'BRL'\",\n\tunit_area: \"fixo 'm2'\",\n\tunit_distance: \"fixo 'meters'\",\n\n\t// Cabeçalho\n\treference: \"id (number→string)\",\n\ttitle: \"generalData.title\",\n\tdescription: \"generalData.description\",\n\n\t// SEO\n\tseo_slug: \"(Vazio - não disponível na API)\",\n\tseo_title: \"(Vazio - não disponível na API)\",\n\tseo_description: \"(Vazio - não disponível na API)\",\n\tseo_keywords: \"(Vazio - não disponível na API)\",\n\n\t// Mídia\n\tmain_image: \"images[0] (filtrar displaySite=true, primeira imagem)\",\n\timages: \"images[] (filtrar displaySite=true, excluir pic360)\",\n\tvideos: \"generalData.urlVideo (array com 1 item se existir)\",\n\tvirtual_tours: \"generalData.urlTour (array com 1 item se existir)\",\n\n\t// Ficha técnica\n\toperacao: \"destination.sale→'venda', destination.rent→'locacao', destination.season→'temporada' (array)\",\n\ttipo: \"generalData.category.name\",\n\tdormitorios: \"features.bedroom\",\n\tsuites: \"features.suite\",\n\tbanheiros: \"features.bathroom (só bathroom, toilet vai pra features_toilet separado)\",\n\tvagas_garagem: \"features.coveredGarage + features.outdoorGarage (soma cobertas + descobertas)\",\n\tarea_total: \"dimensions.totalArea (m²)\",\n\tarea_privativa: \"dimensions.privateArea (m²)\",\n\tarea_util: \"dimensions.usefulArea (m²)\",\n\tdestaque: \"website.highlight || website.superHighlight (true se qualquer um true)\",\n\n\t// Valores\n\tvalor_venda: \"values.saleValue (REAIS, só se destination.sale=true e > 0)\",\n\tvalor_locacao: \"values.rentValue (REAIS, só se destination.rent=true e > 0)\",\n\tvalor_condominio: \"values.condominiumFee (REAIS)\",\n\tvalor_iptu: \"values.iptuValue (REAIS, ANUAL)\",\n\n\t// Localização\n\tendereco_cep: \"location.zipCode (formatado 00000-000)\",\n\tendereco_estado: \"location.city.state\",\n\tendereco_cidade: \"location.city.name\",\n\tendereco_bairro: \"location.district.name\",\n\tendereco_logradouro: \"location.address\",\n\tendereco_numero: \"location.number\",\n\tendereco_complemento: \"location.complement\",\n\tendereco_referencia: \"location.referencePoint\",\n\tendereco_zona: \"(Vazio - não disponível na API)\",\n\tlat: \"location.latitude (string→number)\",\n\tlng: \"location.longitude (string→number)\",\n\n\t// Relações\n\tcorretor_key: \"(Vazio - não disponível na API)\",\n\tcorretor_nome: \"Campo personalizado 'Corretor' (se existir)\",\n\tcondominio_key: \"(Vazio - não disponível na API)\",\n\tcondominio_nome: \"generalData.allotment (nome do empreendimento/loteamento/edifício)\",\n};\n\nexport const HorizonPropertySchemaBySi9: EntitySchema = {\n\tentity: \"property\",\n\tversion: \"3.2.0\",\n\tdescription: \"Schema estendido SI9 CRM — 45 base com source tracking + extras snake_case\",\n\tfields: [\n\t\t// Injeta source nos campos base\n\t\t...horizonPropertySchemaBase.fields.map((field) => ({\n\t\t\t...field,\n\t\t\taudit: {\n\t\t\t\t...field.audit,\n\t\t\t\t...(BASE_SOURCE_MAP[field.key] ? { source: BASE_SOURCE_MAP[field.key] } : {}),\n\t\t\t},\n\t\t})),\n\n\t\t// ========================================\n\t\t// values.*\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"values_discount_value\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"currency\",\n\t\t\tunit: \"BRL\",\n\t\t\tcategories: [\"valores\"],\n\t\t\tui: { label: \"Valor de desconto\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"values.discountValue (REAIS)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"values_fci_value\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"currency\",\n\t\t\tunit: \"BRL\",\n\t\t\tcategories: [\"valores\"],\n\t\t\tui: { label: \"Valor FCI\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"values.fciValue (REAIS)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"values_assigned_value\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"currency\",\n\t\t\tunit: \"BRL\",\n\t\t\tcategories: [\"valores\"],\n\t\t\tui: { label: \"Valor atribuído\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"values.assignedValue (REAIS)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"values_trash_fee\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"currency\",\n\t\t\tunit: \"BRL\",\n\t\t\tcategories: [\"valores\"],\n\t\t\tui: { label: \"Taxa de lixo\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"values.trashFee (REAIS)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"values_disaster_fee\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"currency\",\n\t\t\tunit: \"BRL\",\n\t\t\tcategories: [\"valores\"],\n\t\t\tui: { label: \"Taxa de sinistro\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"values.disasterFee (REAIS)\" },\n\t\t},\n\n\t\t// ========================================\n\t\t// general_data.*\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"general_data_situation\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"situacoes\"],\n\t\t\tui: { label: \"Situação\" },\n\t\t\tenum: {\n\t\t\t\tSOLD: \"Vendido\",\n\t\t\t\tRENTED: \"Alugado\",\n\t\t\t\tRESERVED: \"Reservado\",\n\t\t\t},\n\t\t\taudit: {\n\t\t\t\torigin: \"si9:property\",\n\t\t\t\tsource:\n\t\t\t\t\t\"generalData.situation (enum: AVALIABLE, INACTIVE, RENTED, RESERVED, SOLD, INVOICE, TODOCUMENT, DELETE, TERMINATION, RENOVATION)\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"general_data_board\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"comercial\"],\n\t\t\tui: { label: \"Placa\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"generalData.board\" },\n\t\t},\n\n\t\t// ========================================\n\t\t// website.*\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"website_super_highlight\",\n\t\t\ttype: \"Boolean\",\n\t\t\tcategories: [\"comercial\"],\n\t\t\tui: { label: \"Super destaque\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"website.superHighlight\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"website_show_in_core\",\n\t\t\ttype: \"Boolean\",\n\t\t\tcategories: [\"comercial\"],\n\t\t\tui: { label: \"Publicado no núcleo\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"website.showInCore\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"website_mcmv\",\n\t\t\ttype: \"Boolean\",\n\t\t\tcategories: [\"comercial\"],\n\t\t\tui: { label: \"Minha Casa Minha Vida\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"website.mcmv\" },\n\t\t},\n\n\t\t// ========================================\n\t\t// destination.*\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"destination_exchange\",\n\t\t\ttype: \"Boolean\",\n\t\t\tcategories: [\"comercial\"],\n\t\t\tui: { label: \"Aceita permuta\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"destination.exchange\" },\n\t\t},\n\n\t\t// ========================================\n\t\t// location.* (complementar)\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"location_apartment\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"endereco\"],\n\t\t\tui: { label: \"Apartamento\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"location.apartment\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"location_block\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"endereco\"],\n\t\t\tui: { label: \"Bloco\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"location.block\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"location_floor\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"endereco\"],\n\t\t\tui: { label: \"Andar\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"location.floor (string: '1', '10', 'Terreo')\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"location_quatrain\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"endereco\"],\n\t\t\tui: { label: \"Quadra\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"location.quatrain\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"location_lot\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"endereco\"],\n\t\t\tui: { label: \"Lote\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"location.lot\" },\n\t\t},\n\n\t\t// ========================================\n\t\t// dimensions.*\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"dimensions_building_area\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"area\",\n\t\t\tunit: \"m2\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Área construída\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.buildingArea (m²)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"dimensions_land_area\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"area\",\n\t\t\tunit: \"m2\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Área do terreno\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.landArea (m²)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"dimensions_internal_area\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"area\",\n\t\t\tunit: \"m2\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Área interna\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.internalArea (m²)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"dimensions_registered_area\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"area\",\n\t\t\tunit: \"m2\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Área registrada\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.registeredArea (m²)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"dimensions_common_area\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"area\",\n\t\t\tunit: \"m2\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Área comum\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.commonArea (m²)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"dimensions_garage_area\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"area\",\n\t\t\tunit: \"m2\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Área da garagem\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.garageArea (m²)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"dimensions_front_size\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"distance\",\n\t\t\tunit: \"m\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Frente do terreno\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.frontSize (metros)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"dimensions_funds_size\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"distance\",\n\t\t\tunit: \"m\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Fundos do terreno\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.fundsSize (metros)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"dimensions_left_size\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"distance\",\n\t\t\tunit: \"m\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Lateral esquerda\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.leftSize (metros)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"dimensions_right_size\",\n\t\t\ttype: \"Number\",\n\t\t\tformat: \"distance\",\n\t\t\tunit: \"m\",\n\t\t\tcategories: [\"medidas\"],\n\t\t\tui: { label: \"Lateral direita\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"dimensions.rightSize (metros)\" },\n\t\t},\n\n\t\t// ========================================\n\t\t// features (booleans → array) + features.* (numbers/strings)\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"features\",\n\t\t\ttype: \"String[]\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tdb: { type: \"jsonb\", index: \"gin\" },\n\t\t\tui: { label: \"Características\" },\n\t\t\taudit: {\n\t\t\t\torigin: \"si9:property\",\n\t\t\t\tsource: \"features booleans true → labels PT-BR via FEATURES_LABELS (27 booleans)\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"features_room\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tui: { label: \"Salas\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.room\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_kitchen\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tui: { label: \"Cozinhas\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.kitchen\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_closet\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tui: { label: \"Closets\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.closet\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_balcony\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tui: { label: \"Sacadas\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.balcony\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_ar_condicionado\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tui: { label: \"Ar condicionado\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.arCondicionado (quantidade)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_toilet\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tui: { label: \"Lavabos\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.toilet (separado de banheiros)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_floor\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"estrutura\"],\n\t\t\tui: { label: \"Tipo de piso\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.floor (ex: Porcelanato, Madeira)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_roof\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"estrutura\"],\n\t\t\tui: { label: \"Tipo de telhado\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.roof (ex: Cerâmico, Laje)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_ceiling\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"estrutura\"],\n\t\t\tui: { label: \"Tipo de forro\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.ceiling (ex: Gesso, PVC, Laje)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_paving\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"estrutura\"],\n\t\t\tui: { label: \"Pavimentação interna\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.paving (string livre, dados inconsistentes)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"features_pavement\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"estrutura\"],\n\t\t\tui: { label: \"Tipo de calçamento\" },\n\t\t\tenum: { COBBLESTONE: \"Paralelepípedo\", ASPHALT: \"Asfalto\", GRAVEL: \"Cascalho\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"features.pavement (enum: COBBLESTONE, ASPHALT, GRAVEL)\" },\n\t\t},\n\n\t\t// ========================================\n\t\t// security (booleans → array)\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"security\",\n\t\t\ttype: \"String[]\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tdb: { type: \"jsonb\", index: \"gin\" },\n\t\t\tui: { label: \"Segurança\" },\n\t\t\taudit: {\n\t\t\t\torigin: \"si9:property\",\n\t\t\t\tsource: \"security booleans true → labels PT-BR via SECURITY_LABELS (8 booleans)\",\n\t\t\t},\n\t\t},\n\n\t\t// ========================================\n\t\t// recreation (booleans → array) + recreation.* (enums)\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"recreation\",\n\t\t\ttype: \"String[]\",\n\t\t\tcategories: [\"ficha-tecnica\"],\n\t\t\tdb: { type: \"jsonb\", index: \"gin\" },\n\t\t\tui: { label: \"Lazer\" },\n\t\t\taudit: {\n\t\t\t\torigin: \"si9:property\",\n\t\t\t\tsource: \"recreation booleans true → labels PT-BR via RECREATION_LABELS (9 booleans)\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"recreation_heating\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"estrutura\"],\n\t\t\tui: { label: \"Aquecimento\" },\n\t\t\tenum: { GAS: \"Gás\", SOLAR: \"Solar\", ELETRIC: \"Elétrico\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"recreation.heating (enum: GAS, SOLAR, ELETRIC)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"recreation_position_sun\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"estrutura\"],\n\t\t\tui: { label: \"Posição solar\" },\n\t\t\tenum: { NORTH: \"Norte\", SOUTH: \"Sul\", EAST: \"Leste\", WEST: \"Oeste\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"recreation.positionSun (enum: NORTH, SOUTH, EAST, WEST)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"recreation_position_court\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"estrutura\"],\n\t\t\tui: { label: \"Posição na quadra\" },\n\t\t\tenum: { MIDDLE_COURT: \"Meio de quadra\", CORNER: \"Esquina\", SUB_CORNER: \"Sub-esquina\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"recreation.positionCourt (enum: MIDDLE_COURT, CORNER, SUB_CORNER)\" },\n\t\t},\n\n\t\t// ========================================\n\t\t// rural (booleans → array) + rural.* (numbers/strings)\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"rural\",\n\t\t\ttype: \"String[]\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tdb: { type: \"jsonb\", index: \"gin\" },\n\t\t\tui: { label: \"Características rurais\" },\n\t\t\taudit: {\n\t\t\t\torigin: \"si9:property\",\n\t\t\t\tsource: \"rural booleans true → labels PT-BR via RURAL_LABELS (4 booleans: river, mine, hose, footballField)\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_bushels\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Sacas\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.bushels (capacidade produtiva)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_acre\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Alqueires\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.acre\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_pasture\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Pastagem\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.pasture (ex: formado, degradado)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_mechanized\",\n\t\t\ttype: \"String\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Mecanizada\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.mechanized (ex: total, parcial)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_reserve\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Reserva\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.reserve (hectares)\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_pigsty\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Pocilgas\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.pigsty\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_aviary\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Aviários\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.aviary\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_weir\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Açudes\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.weir\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_wood_house\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Casas de madeira\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.woodHouse\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_brick_house\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Casas de alvenaria\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.brickHouse\" },\n\t\t},\n\t\t{\n\t\t\tkey: \"rural_mixed_house\",\n\t\t\ttype: \"Number\",\n\t\t\tcategories: [\"rural\"],\n\t\t\tui: { label: \"Casas mistas\" },\n\t\t\taudit: { origin: \"si9:property\", source: \"rural.mixedHouse\" },\n\t\t},\n\n\t\t// ========================================\n\t\t// fields (campos extras)\n\t\t// ========================================\n\t\t{\n\t\t\tkey: \"fields\",\n\t\t\ttype: \"Json\",\n\t\t\tcategories: [\"dados-extras\"],\n\t\t\tdb: { type: \"jsonb\" },\n\t\t\tui: { label: \"Campos extras\" },\n\t\t\taudit: {\n\t\t\t\torigin: \"si9:property\",\n\t\t\t\tsource: \"fields[] ({field, value} — campos personalizados criados pela imobiliária)\",\n\t\t\t},\n\t\t},\n\t],\n};\n\nexport default HorizonPropertySchemaBySi9;\n","import { z } from \"zod\"\nimport { HorizonPropertySchemaBaseZod } from \"@horizon-domains/property-model\"\n\n// ========================================\n// SCHEMAS DE MÍDIA (override para opcional)\n// ========================================\nconst ImageSchema = z\n .object({\n md: z.string().optional(),\n sm: z.string().optional(),\n full: z.string().optional(),\n cover: z.boolean().optional(),\n })\n .passthrough()\n\nconst VideoSchema = z\n .object({\n url: z.string().optional(),\n embed_url: z.string().optional(),\n })\n .passthrough()\n\nconst VirtualTourSchema = z\n .object({\n embed_url: z.string().optional(),\n })\n .passthrough()\n\nconst MainImageSchema = z\n .object({\n md: z.string().optional(),\n sm: z.string().optional(),\n full: z.string().optional(),\n })\n .passthrough()\n\n// ========================================\n// Schema Horizon para SI9 CRM\n// Todas as keys em snake_case minúsculo\n// Campos aninhados com prefixo do grupo (Regra 3+5)\n// ========================================\n\nexport const HorizonPropertySchemaBySi9Zod = HorizonPropertySchemaBaseZod\n .omit({ images: true, videos: true, virtual_tours: true, main_image: true })\n .extend({\n // Mídia (override mais flexível)\n images: z.array(ImageSchema).optional(),\n videos: z.array(VideoSchema).optional(),\n virtual_tours: z.array(VirtualTourSchema).optional(),\n main_image: MainImageSchema.optional(),\n\n // ========================================\n // SI9 EXTRAS — values.*\n // ========================================\n values_discount_value: z.number().min(0).optional(),\n values_fci_value: z.number().min(0).optional(),\n values_assigned_value: z.number().min(0).optional(),\n values_trash_fee: z.number().min(0).optional(),\n values_disaster_fee: z.number().min(0).optional(),\n\n // ========================================\n // SI9 EXTRAS — general_data.*\n // ========================================\n general_data_situation: z.string().optional(),\n general_data_board: z.string().optional(),\n general_data_allotment: z.string().optional(),\n\n // ========================================\n // SI9 EXTRAS — website.*\n // ========================================\n website_super_highlight: z.boolean().optional(),\n website_show_in_core: z.boolean().optional(),\n website_mcmv: z.boolean().optional(),\n\n // ========================================\n // SI9 EXTRAS — destination.*\n // ========================================\n destination_exchange: z.boolean().optional(),\n\n // ========================================\n // SI9 EXTRAS — location.* (complementar)\n // ========================================\n location_apartment: z.string().optional(),\n location_block: z.string().optional(),\n location_floor: z.string().optional(),\n location_quatrain: z.string().optional(),\n location_lot: z.string().optional(),\n\n // ========================================\n // SI9 EXTRAS — dimensions.*\n // ========================================\n dimensions_building_area: z.number().min(0).optional(),\n dimensions_land_area: z.number().min(0).optional(),\n dimensions_internal_area: z.number().min(0).optional(),\n dimensions_registered_area: z.number().min(0).optional(),\n dimensions_common_area: z.number().min(0).optional(),\n dimensions_garage_area: z.number().min(0).optional(),\n dimensions_front_size: z.number().min(0).optional(),\n dimensions_funds_size: z.number().min(0).optional(),\n dimensions_left_size: z.number().min(0).optional(),\n dimensions_right_size: z.number().min(0).optional(),\n\n // ========================================\n // SI9 EXTRAS — features (booleans → array)\n // ========================================\n features: z.array(z.string()).optional(),\n\n // ========================================\n // SI9 EXTRAS — features.* (numbers/strings)\n // ========================================\n features_room: z.number().optional(),\n features_kitchen: z.number().optional(),\n features_closet: z.number().optional(),\n features_balcony: z.number().optional(),\n features_ar_condicionado: z.number().optional(),\n features_toilet: z.number().optional(),\n features_floor: z.string().optional(),\n features_roof: z.string().optional(),\n features_ceiling: z.string().optional(),\n features_paving: z.string().optional(),\n features_pavement: z.string().optional(),\n\n // ========================================\n // SI9 EXTRAS — security (booleans → array)\n // ========================================\n security: z.array(z.string()).optional(),\n\n // ========================================\n // SI9 EXTRAS — recreation (booleans → array)\n // ========================================\n recreation: z.array(z.string()).optional(),\n\n // ========================================\n // SI9 EXTRAS — recreation.* (strings/enums)\n // ========================================\n recreation_heating: z.string().optional(),\n recreation_position_sun: z.string().optional(),\n recreation_position_court: z.string().optional(),\n\n // ========================================\n // SI9 EXTRAS — rural (booleans → array)\n // ========================================\n rural: z.array(z.string()).optional(),\n\n // ========================================\n // SI9 EXTRAS — rural.* (numbers/strings)\n // ========================================\n rural_bushels: z.number().optional(),\n rural_acre: z.number().optional(),\n rural_pasture: z.string().optional(),\n rural_mechanized: z.string().optional(),\n rural_reserve: z.number().optional(),\n rural_pigsty: z.number().optional(),\n rural_aviary: z.number().optional(),\n rural_weir: z.number().optional(),\n rural_wood_house: z.number().optional(),\n rural_brick_house: z.number().optional(),\n rural_mixed_house: z.number().optional(),\n\n // ========================================\n // SI9 EXTRAS — fields (campos extras)\n // ========================================\n fields: z\n .array(\n z.object({\n field: z.string(),\n value: z.string(),\n }),\n )\n .optional(),\n\n })\n .passthrough()\n\n// Tipo inferido\nexport type HorizonPropertySchemaBySi9Type = z.infer<\n typeof HorizonPropertySchemaBySi9Zod\n>\n\n// Helper de validação\nexport const validateHorizonPropertySchemaBySi9 = (\n data: unknown,\n): HorizonPropertySchemaBySi9Type => {\n return HorizonPropertySchemaBySi9Zod.parse(data)\n}\n\n// Helper de validação safe\nexport const safeValidateHorizonPropertySchemaBySi9 = (data: unknown) => {\n return HorizonPropertySchemaBySi9Zod.safeParse(data)\n}\n\n// Helper de validação parcial\nexport const validatePartialHorizonPropertySchemaBySi9 = (data: unknown) => {\n return HorizonPropertySchemaBySi9Zod.partial().parse(data)\n}\n"],"mappings":"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","names":["z"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@horizon-integrations/si9-crm",
3
- "version": "1.1.7",
3
+ "version": "1.1.9",
4
4
  "description": "Integração da Imobland Horizon com a SI9 CRM",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",