Feed XML per Progetti e Layout
1. Scopo del Feed
Il feed XML trasferisce dati strutturati su progetti immobiliari e layout типici. Il suo scopo è consentire al sistema ricevente di creare e aggiornare automaticamente le schede progetto, mostrare prezzi, stati, gallerie, servizi, condizioni di pagamento, EOI e materiali promozionali di marketing forniti dai developer.
Il feed trasferisce i layout in forma aggregata: un record di layout descrive un layout tipico e il numero di unità disponibili di quel tipo. Non si tratta di un elenco di appartamenti, uffici o lotti specifici.
- realty-feed: contenitore root dell’intero feed XML. ID principale: —
- offers: un progetto o complesso. ID principale: complex-id
- layouts: layout tipico all’interno di un progetto. ID principale: id
- payment_plans: un’opzione di pagamento del progetto. ID principale: id
- eoi_item: una condizione EOI. ID principale: —
- stock: campagna marketing, notizia o messaggio promozionale del developer. ID principale: —
1.1 Cos’è un XML Feed
Un XML feed è un file strutturato che contiene dati su progetti immobiliari e layout tipici. Include descrizioni, foto, prezzi, indirizzi, stati, specifiche, servizi e altri dati necessari per mostrare gli immobili sul sito di un’agenzia o in un catalogo.
In termini semplici, un XML feed è un flusso di dati immobiliari che il sistema ricevente scarica regolarmente, legge e utilizza per aggiornare automaticamente le schede immobile.
Alnair fornisce i dati. Lo sviluppo del sito, del catalogo, l’integrazione CRM e la logica di importazione sono gestiti dal cliente o dal team tecnico del cliente.
1.2 Cosa Serve all’Agenzia
Per utilizzare il feed XML, l’agenzia necessita di una propria infrastruttura tecnica in grado di scaricare regolarmente l’XML, analizzarne la struttura e aggiornare i dati nel proprio sistema.
- Sito web o catalogo immobiliare: il luogo in cui verranno mostrati i progetti e i layout del feed.
- Team tecnico o sviluppatore: configurazione del download XML, parsing e importazione.
- Parser XML: lettura della struttura XML e conversione nel modello dati interno.
- Modulo di importazione: creazione, aggiornamento e disattivazione di progetti e layout.
- Scheduler: esecuzione regolare dell’importazione secondo un programma, ad esempio tramite cron o scheduler.
- Log errori: monitoraggio di valori enum sconosciuti, campi vuoti ed errori di caricamento.
1.3 Come l’Agenzia Utilizza il Feed XML
Un flusso di lavoro tipico è il seguente:
- Il sistema dell’agenzia scarica l’XML da un link web personale.
- L’XML viene salvato come snapshot grezzo per diagnosi e rielaborazione.
- Il parser legge la struttura realty-feed, offers, layouts e i blocchi annidati.
- Il modulo di importazione crea nuovi progetti e layout oppure aggiorna quelli esistenti.
- Gli oggetti che scompaiono dal nuovo feed vengono contrassegnati come inattivi.
- Il sito dell’agenzia mostra schede progetto, prezzi, gallerie e stati aggiornati.
Principali funzionalità di integrazione:
- Aggiornamenti automatici: progetti e layout vengono aggiornati senza intervento manuale.
- Creazione pagine immobile: i dati del feed vengono usati per le schede progetto e layout.
- Prezzi e stati sempre aggiornati: il sito riceve gli aggiornamenti XML secondo la pianificazione.
- Filtri e ricerca: è possibile filtrare per area, prezzo, tipologia immobile, numero di stanze e metratura.
- Gallerie media: foto del progetto, gallerie tematiche e immagini dei layout possono essere visualizzate nell’interfaccia.
2. Struttura Generale XML
<realty-feed>
<generation-date>2026-06-17T12:06:39+04:00</generation-date>
<offers>...</offers>
<offers>...</offers>
</realty-feed>
- realty-feed: oggetto. Blocco root del feed.
- generation-date: datetime. Data e ora di generazione dell’XML. Usato per verificare l’aggiornamento dei dati.
- offers: object[]. Elenco di progetti o complessi. Ogni blocco offers contiene i dati del progetto e i relativi layout.
2.1 Accesso al Feed e Limiti di Download
Il feed viene fornito al cliente tramite un link web personale. Il link è univoco per il cliente e viene utilizzato dal sistema ricevente per scaricare automaticamente l’XML.
Il link personale è disponibile per l’amministratore nell’account Alnair. L’amministratore può condividere questo link con il team tecnico del cliente per configurare l’importazione.
- Tipo di accesso: link web personale. URL individuale del feed XML per il cliente.
- Dove ottenere il link: account Alnair. Il link è disponibile per l’amministratore del cliente.
- Frequenza di aggiornamento del feed: ogni 4 ore. I dati XML vengono aggiornati sul lato Alnair una volta ogni 4 ore.
- Intervallo minimo di download: non più di una volta all’ora. Il sistema ricevente non deve accedere al feed più di una volta all’ora.
- Superamento del limite: blocco dell’accesso. Se le richieste sono troppo frequenti, l’accesso al feed può essere temporaneamente bloccato.
Logica di integrazione consigliata: configurare il download pianificato tramite cron o scheduler, salvare l’ultimo XML ricevuto e non richiedere il feed a ogni caricamento di pagina del sito. La modalità ottimale è scaricare il feed non più di una volta all’ora, tenendo conto che i nuovi dati compaiono circa ogni 4 ore.
3. Progetto: <offers>
offers è l’elemento principale del feed. Contiene la descrizione del progetto, il developer, la posizione, lo stato di costruzione e di vendita, i prezzi, i media, i servizi, i piani di pagamento, l’EOI, le promozioni di marketing e i layout tipici.
<offers>
<complex-id>5646</complex-id>
<type>project</type>
<logo>https://...</logo>
<photo>https://...</photo>
<title>...</title>
<description>...</description>
<price_on_request>1</price_on_request>
<status>...</status>
<construction_start_at>2025-01-01T00:00:00+04:00</construction_start_at>
<construction_progress>15</construction_progress>
<planned_completion_at>2027-12-31T00:00:00+04:00</planned_completion_at>
<predicted_completion_at>2027-12-31T00:00:00+04:00</predicted_completion_at>
<amenities>...</amenities>
<developer>...</developer>
<city>Dubai</city>
<address>...</address>
<latitude>25.000000</latitude>
<longitude>55.000000</longitude>
<districts>...</districts>
<album>...</album>
<albums>...</albums>
<constructions_count>1</constructions_count>
<for_sale_count>10</for_sale_count>
<price>...</price>
<br_prices>...</br_prices>
<updated_at>2026-06-17T10:53:20+04:00</updated_at>
<is_sold_out>0</is_sold_out>
<payment_plans>...</payment_plans>
<sales_status>...</sales_status>
<stocks>...</stocks>
<eoi>...</eoi>
<service_charge>...</service_charge>
<assignment>...</assignment>
<is_limited_publication>0</is_limited_publication>
<layouts>...</layouts>
</offers>
- complex-id: integero. ID univoco del progetto in Alnair. Usare come ID esterno del progetto per upsert.
- type: enum. Tipo di entità di livello superiore: project o compound. Memorizzare il valore grezzo e importarlo come progetto di primo livello.
- logo: url. Logo del progetto. Mostrare nel branding, non usare come copertina.
- photo: url. Immagine principale del progetto / copertina. Usare come immagine di copertina e hero image.
- title: oggetto localizzato. Nome del progetto in en/ru/ar. Mostrare in base alla lingua dell’interfaccia.
- description: HTML localizzato. Descrizione del progetto in en/ru/ar. Renderizzare in modo sicuro; l’HTML è all’interno di CDATA.
- price_on_request: 0/1. Flag di occultamento del prezzo. Se 1, mostrare “Prezzo su richiesta”.
- status: oggetto. Stato di costruzione. Da non confondere con sales_status.
- construction_start_at: datetime. Data di inizio costruzione. Mostrare se valorizzata.
- construction_progress: decimal. Percentuale di completamento della costruzione. Mostrare come percentuale.
- planned_completion_at: datetime. Data prevista di completamento del progetto. Usare come data di consegna.
- predicted_completion_at: datetime. Data stimata di completamento. Può essere usata come data di completamento aggiornata.
- amenities: oggetto. Servizi e caratteristiche del progetto. Mappare per chiave.
- developer: oggetto. Developer del progetto. Memorizzare nome e logo.
- city / address: string. Città e indirizzo del progetto. Usare nei dati di localizzazione.
- latitude / longitude: decimal. Coordinate. Usare per la mappa.
- districts: oggetto. Quartieri del progetto. Usare per filtri e scheda progetto.
- album: oggetto. Galleria principale del progetto, non categorizzata. Mostrare come galleria generale.
- albums: oggetto. Gallerie tematiche del progetto. Raggruppare per titolo.
- for_sale_count: integer. Numero di unità disponibili nel progetto. Può essere mostrato come disponibilità.
- price: oggetto. Fascia di prezzo generale del progetto. Nascondere quando price_on_request=1.
- br_prices: object[]. Prezzi per numero di camere o categoria. Usare per filtri e listing.
- updated_at: datetime. Data di aggiornamento del progetto. Usare per la sincronizzazione.
- is_sold_out: 0/1. Flag di esaurito. Usare insieme a sales_status.
- payment_plans: object[]. Opzioni di pagamento del developer. Mostrare come opzioni di pagamento.
- sales_status: oggetto localizzato. Stato di vendita del progetto. Definisce la fase commerciale.
- stocks: oggetto. Campagne marketing e messaggi promozionali del developer. Mostrare come blocchi promo.
- eoi: oggetto. Expression of Interest. Mostrare solo per Presale (EOI).
- service_charge: oggetto. Spese condominiali. Mostrare se il valore è valorizzato.
- assignment: decimal. Condizione di assignment. Vuoto significa non specificato.
- is_limited_publication: 0/1. Restrizione di pubblicazione. Se 1, non pubblicare pubblicamente senza autorizzazione.
- layouts: object[]. Layout tipici del progetto. Importare come entità figlie del progetto.
4. Campi Localizzati
I campi localizzati hanno la stessa struttura: i valori in inglese, russo e arabo vengono passati all’interno del tag.
<title>
<en>Nome del progetto</en>
<ru>Название проекта</ru>
<ar>اسم المشروع</ar>
</title>
- en: valore in inglese. Fallback consigliato.
- ru: valore in russo.
- ar: valore in arabo.
Regola di fallback:
- Usare la lingua dell’interfaccia se è valorizzata.
- Se la lingua richiesta è vuota, usare en.
- Se en è vuoto, usare ru.
- Se ru è vuoto, usare ar.
- Se tutti i valori sono vuoti, non mostrare il campo.
5. Stati
5.1 Stato di Costruzione: <status>
Lo stato di costruzione mostra la condizione fisica del progetto. Non indica la disponibilità alla vendita.
<status>
<key>development_stage_progress</key>
<en>In Corso</en>
<ru>Строится</ru>
<ar>قيد الإنشاء</ar>
</status>
- Scheduled: il progetto è pianificato.
- In Progress: la costruzione è in corso.
- Ready: il progetto è completato.
- Stopped: la costruzione è sospesa.
5.2 Stato di Vendita: <sales_status>
Lo stato di vendita mostra la fase commerciale del progetto: annuncio, pre-vendita, lancio, vendite attive o sold out.
- Preliminary Info: informazioni iniziali sul progetto.
- Announcement: il progetto è stato annunciato.
- Presale (EOI): è in corso la raccolta EOI.
- Launch: lancio delle vendite.
- On Sale: il progetto è disponibile all’acquisto.
- Sold Out: il progetto è esaurito.
- Pending: lo stato è in attesa di aggiornamento.
6. Developer e Posizione
Questi blocchi servono a mostrare il brand del developer e la posizione geografica del progetto.
<developer>
<title>
<en>Nome del developer</en>
<ru>Nome del developer</ru>
<ar>Nome del developer</ar>
</title>
<logo>https://...</logo>
</developer>
<city>Dubai</city>
<address>Indirizzo del progetto, Dubai</address>
<latitude>25.01809076</latitude>
<longitude>55.13354525</longitude>
<districts>
<district>Jumeirah Village Triangle (JVT)</district>
</districts>
- developer.title: oggetto localizzato. Nome del developer.
- developer.logo: url. Logo del developer.
- city: string. Città.
- address: string. Indirizzo.
- latitude / longitude: decimal. Coordinate per la mappa.
- districts.district: string[]. Quartieri del progetto.
7. Prezzi
7.1 Prezzo del Progetto: <price>
Il prezzo a livello di progetto mostra la fascia di prezzo generale delle offerte disponibili nel progetto.
<price>
<min>815462</min>
<max>2089780</max>
<min_usd>222009</min_usd>
<max_usd>568942</max_usd>
<currency>AED</currency>
</price>
- min: decimal. Prezzo minimo.
- max: decimal. Prezzo massimo.
- min_usd: decimal. Prezzo minimo in USD.
- max_usd: decimal. Prezzo massimo in USD.
- currency: enum. Valuta principale, di solito AED.
Se price_on_request = 1, i prezzi esatti non vengono mostrati pubblicamente, anche se il prezzo è valorizzato.
7.2 Prezzi per Categoria: <br_prices>
br_prices raggruppa prezzi e superfici per numero di camere o tipologia immobiliare. È utile per filtri e schede progetto sintetiche.
<br_prices>
<key>1</key>
<count>7</count>
<min_price>1070564</min_price>
<max_price>1289674</max_price>
<min_price_m2>17204</min_price_m2>
<max_price_m2>18483</max_price_m2>
<currency>AED</currency>
<min_area><m2>57.92</m2><ft2>623.45</ft2></min_area>
<max_area><m2>74.17</m2><ft2>798.36</ft2></max_area>
</br_prices>
- studio: monolocali.
- 1-6: numero di camere da letto.
- villa: ville.
- townhouse: villette a schiera.
- n: non applicabile / categoria non residenziale / altro.
8. Media
I media nel feed sono suddivisi in diversi tipi. Non vanno unificati in un’unica galleria senza considerare il loro scopo: un’immagine può essere la copertina del progetto, un’altra il logo, un’altra ancora un’immagine promozionale o una planimetria.
- logo: offers.logo. Logo del progetto. Mostrare nel branding del progetto; non usare come copertina.
- photo: offers.photo. Immagine principale del progetto / copertina. Usare come immagine di copertina nella scheda e come hero image nella pagina progetto.
- album.image: offers.album.image. Galleria principale del progetto, non categorizzata. Mostrare nella galleria generale del progetto.
- albums.album.images.image: offers.albums.album.images.image. Galleria tematica del progetto. Raggruppare per albums.album.title.
- developer.logo: offers.developer.logo. Logo del developer. Mostrare nel blocco developer.
- stocks.stock.logo: offers.stocks.stock.logo. Immagine della campagna marketing. Mostrare all’interno del blocco promozionale.
- layouts.album.image: offers.layouts.album.image. Galleria di uno specifico layout tipico. Mostrare a livello di layout.
- levels_photos.level_photo.image: offers.layouts.levels_photos.level_photo.image. Immagine del layout per livello. Usare come planimetria.
<photo>https://...</photo>
<album>
<image>https://...</image>
</album>
<albums>
<album>
<title><en>Infrastruttura</en><ru>Инфраструктура</ru><ar>...</ar></title>
<images>
<image>https://...</image>
</images>
</album>
</albums>
- Presentazione del progetto: immagini di presentazione del progetto.
- Avanzamento lavori: foto dell’avanzamento della costruzione.
- Esempi di finiture: esempi di finiture.
- Infrastruttura: infrastruttura del progetto.
- Vista: viste e dintorni.
Non tutte le categorie devono essere presenti in ogni progetto. Se il titolo della categoria è vuoto, le immagini possono essere importate come non categorizzate oppure inserite nella galleria generale.
Nella struttura attuale non esiste un tag XML separato per history/story. Notizie, messaggi promozionali e materiali di marketing del progetto vengono trasmessi tramite stocks. Per la cronologia dei lavori è possibile utilizzare la categoria Avanzamento lavori, se presente in albums.
9. Servizi
amenities descrive i servizi e le caratteristiche del progetto. Per l’integrazione è meglio usare key, mentre i valori localizzati devono essere usati per la visualizzazione.
<amenities>
<amenity>
<key>project_facilities_gym</key>
<en>Palestra</en>
<ru>Тренажёрный зал</ru>
<ar>صالة رياضية</ar>
</amenity>
</amenities>
- amenities: oggetto. Contenitore dei servizi.
- amenity: oggetto. Un singolo servizio.
- key: enum. Chiave tecnica.
- en / ru / ar: string. Nome del servizio nelle tre lingue.
La chiave projecet_hotel_license contiene un refuso, ma deve essere mappata come Hotel License. Si consiglia di supportare l’alias e non interrompere l’importazione.
10. Promozioni di Marketing: <stocks>
stocks contiene campagne marketing, notizie e messaggi promozionali dei developer. Possono includere prezzi speciali, sconti, condizioni di lancio, annunci EOI, offerte di pagamento temporanee e materiali pubblicitari. Questo blocco non è una giacenza di inventario e non definisce la disponibilità delle unità.
<stocks>
<stock>
<title>...</title>
<description>...</description>
<start_at>2025-06-26T00:00:00+04:00</start_at>
<end_at/>
<logo>https://...</logo>
</stock>
</stocks>
- stocks: oggetto. Contenitore dei messaggi di marketing.
- stock: oggetto. Una campagna, notizia o comunicazione promozionale.
- title: oggetto localizzato. Titolo della promozione.
- description: HTML localizzato. Descrizione della promozione.
- start_at: datetime. Data di inizio.
- end_at: datetime. Data di fine; può essere vuota.
- logo: url. Immagine della promozione.
Utilizzare for_sale_count, layouts.sale_units_count e sales_status per la disponibilità degli immobili, non stocks.
11. EOI
EOI significa Expression of Interest. Il blocco descrive l’interesse preliminare o le condizioni di caparra per i progetti in stato Presale (EOI).
<eoi>
<is_eoi_return>0</is_eoi_return>
<eoi_items>
<eoi_item>
<price>100000</price>
<percent/>
<description>
<en>Importo EOI per 2 Bedrooms</en>
<ru>Сумма EOI для 2-комнатных</ru>
<ar>...</ar>
</description>
</eoi_item>
</eoi_items>
</eoi>
- is_eoi_return: 0/1/vuoto. 0 = non rimborsabile, 1 = rimborsabile, vuoto = non specificato.
- eoi_items: oggetto. Contenitore delle condizioni EOI.
- eoi_item: oggetto. Una condizione EOI.
- price: decimal. Importo fisso EOI.
- percent: decimal. Percentuale EOI, se utilizzata.
- description: oggetto localizzato. Descrizione della condizione.
- sales_status.en = Presale (EOI) and eoi_items is filled: mostrare EOI.
- Any other sales_status: nascondere EOI.
12. Spese Condominiali e Assignment
<service_charge>
<value>172.22</value>
<unit>sq. m</unit>
<currency>AED</currency>
</service_charge>
<assignment>40.00</assignment>
- service_charge.value: importo delle spese condominiali. Se vuoto, non mostrare il blocco.
- service_charge.unit: unità di calcolo, di solito sq. m. Può essere vuota.
- service_charge.currency: valuta, di solito AED. Può essere vuota.
- assignment: percentuale oltre la quale è possibile l’assignment. Vuoto = informazione non specificata, non una restrizione.
13. Piani di Pagamento: <payment_plans>
payment_plans descrive le opzioni di pagamento dell’immobile fornite dal developer. Un progetto può avere più piani di pagamento. Ogni piano suddivide i pagamenti per fasi: prenotazione, costruzione, consegna e post-consegna. Le commissioni e i costi aggiuntivi vengono trasmessi separatamente, quindi la percentuale totale può superare 100%. Ad esempio, 104% può indicare 100% del prezzo dell’immobile + 4% di DLD fee.
- Basic: id, title, currency. Identificativo del piano, titolo e valuta. title è testo libero, non un enum.
- Booking: on_booking_percent, on_booking_fix, on_booking_payments_count, on_booking_fees. Pagamenti e commissioni nella fase di prenotazione.
- Construction: on_construction_percent, on_construction_fix, on_construction_payments_count, on_construction_fees. Pagamenti durante la costruzione.
- Handover: on_handover_percent, on_handover_fix, on_handover_payments_count, on_handover_fees. Pagamenti alla consegna dell’immobile.
- Post-handover: post_handover_percent, post_handover_fix, on_post_handover_payments_count, on_post_handover_fees. Pagamenti dopo la consegna.
- ROI: roi_percent, roi_fix, roi_payments_count, roi_fees. Campi per schemi ROI o reddito garantito.
- Commissioni aggiuntive: additional, additional_percent, additional_fix, additional_fix_m2. Pagamenti extra, ad esempio DLD Fee.
- Periodi: period_after_handover, period_after_roi. Frequenza dei pagamenti ricorrenti.
- Totali: price_total, fees_included_total. Importi totali del piano e commissioni incluse.
14. Layout: <layouts>
layouts descrive un layout tipico all’interno di un progetto. Si tratta di una tipologia aggregata di unità, non di un appartamento o ufficio specifico.
- id: integero. ID univoco del layout. Usare come ID esterno del layout.
- title: oggetto localizzato. Nome del layout. Mostrare in base alla lingua dell’interfaccia.
- project_id: integero. ID del progetto padre. Collegare con offers.complex-id.
- building_name: oggetto localizzato. Nome dell’edificio. Non mostrare se vuoto.
- price_on_request: 0/1. Flag di occultamento del prezzo. Se 1, non mostrare il prezzo.
- area_min / area_max: oggetto. Intervallo di superficie. m2 e ft2.
- area_balcony_min / area_balcony_max: oggetto. Intervallo superficie balcone. Può essere vuoto.
- type: oggetto localizzato. Tipologia dell’immobile. Vedere il riferimento Unit type.
- sale_units_count: integero. Numero di unità disponibili di questo tipo. Non è un elenco di lotti.
- album: oggetto. Galleria del layout. Mostrare a livello di layout.
- levels_photos: oggetto. Immagini per livello. Usare come planimetrie.
- floors_count: integero. Numero di livelli. 1, 2, 3, ecc.
- rooms_count: oggetto localizzato. Numero di stanze. Vedere il riferimento Rooms count.
- price: oggetto. Fascia di prezzo del layout. Nascondere quando price_on_request=1.
- is_limited_publication: 0/1. Restrizione di pubblicazione. Se 1, nascondere pubblicamente.
15. Riferimenti ai Valori Enum
- Project type: project, compound.
- Sales status: Preliminary Info, Announcement, Presale (EOI), Launch, On Sale, Sold Out, Pending.
- Construction status: Scheduled, Ready, Stopped, In Progress.
- Unit type: Apartment, Villa, Townhouse, Duplex, Triplex, Penthouse, Retail, Office, Suite.
- Rooms count: Studio, 1 BR, 2 BR, 3 BR, 4 BR, 5 BR, 6 BR, 7 BR, 8 BR, NA.
- BR price key: studio, 1, 2, 3, 4, 5, 6, villa, townhouse, n.
- Gallery category: Presentazione del progetto, Avanzamento lavori, Esempi di finiture, Infrastruttura, Vista.
- Currency: AED.
- Service charge unit: sq. m.
- Boolean flags: 0, 1; per alcuni campi è consentito il vuoto.
Se il feed contiene un valore non presente nell’elenco di riferimento, l’importazione non deve fallire. Il valore deve essere memorizzato come valore grezzo, mappato come sconosciuto e registrato per revisione.
16. Valori Vuoti
Un valore vuoto significa “non specificato”, non 0. I tag vuoti possono apparire come <field/> oppure <field></field>.
- assignment: la condizione di assignment non è specificata.
- service_charge.value: le spese condominiali non sono specificate.
- eoi.is_eoi_return: la rimborsabilità dell’EOI non è specificata.
- area_balcony_min.m2: la superficie del balcone non è specificata.
- description.en: la descrizione manca.
17. Regole di Visualizzazione
- Prezzo nascosto: price_on_request = 1. Mostrare “Prezzo su richiesta”.
- Prezzo visibile: price_on_request = 0. Mostrare prezzo min/max.
- EOI: sales_status.en = Presale (EOI) e EOI è valorizzato. Mostrare EOI.
- EOI non rilevante: sales_status.en != Presale (EOI). Nascondere EOI.
- Esaurito: is_sold_out = 1 oppure sales_status.en = Sold Out. Mostrare “Esaurito” oppure nascondere dal listing.
- Pubblicazione limitata: is_limited_publication = 1. Non pubblicare pubblicamente.
- Assignment vuoto: assignment vuoto. Non mostrare il blocco assignment.
- Spese condominiali vuote: service_charge.value vuoto. Non mostrare le spese condominiali.
18. Regole di Importazione
- Progetto: cercare per complex-id; se trovato, aggiornare; se non trovato, creare.
- Layout: cercare per layouts.id; collegare al progetto tramite project_id.
- Cancellazione: se un oggetto scompare dal nuovo feed, marcarlo come inattivo invece di eliminarlo subito.
- Enum sconosciuto: memorizzare il valore grezzo, mapparlo come sconosciuto e registrarlo.
- Valori vuoti: non convertirli in 0 senza una regola esplicita specifica del campo.
19. Struttura Dati Consigliata
Campo progetto → Sorgente
- external_project_id: complex-id.
- raw_offer_type: type.
- title_*: title.
- description_*: description.
- developer_name: developer.title.
- developer_logo_url: developer.logo.
- city/address/coordinates: city, address, latitude, longitude.
- districts: districts.district.
- construction_status: status.en.
- sales_status: sales_status.en.
- price_min / price_max: price.
- price_on_request: price_on_request.
- galleries: photo, album, albums.
- payment_plans: payment_plans.
- eoi: eoi.
- stocks: stocks.
- source_updated_at: updated_at.
Campo layout → Sorgente
- external_layout_id: layouts.id.
- external_project_id: layouts.project_id.
- title_*: layouts.title.
- building_name_*: building_name.
- unit_type: type.en.
- rooms_count: rooms_count.en.
- sale_units_count: sale_units_count.
- area_min / area_max: area_min, area_max.
- balcony_min / balcony_max: area_balcony_min, area_balcony_max.
- floors_count: floors_count.
- price_min / price_max: price.
- layout_gallery: album.
- levels_photos: levels_photos.
- is_limited_publication: is_limited_publication.