Kanał XML dla projektów i układów
1. Cel feedu
Plik XML przekazuje uporządkowane dane o projektach nieruchomości oraz typowych układach. Jego celem jest umożliwienie systemowi odbierającemu automatycznego tworzenia i aktualizowania kart projektów, wyświetlania cen, statusów, galerii, udogodnień, warunków płatności, EOI oraz materiałów promocyjnych od deweloperów.
Feed przekazuje układy w formie zagregowanej: jeden rekord układu opisuje typowy układ oraz liczbę dostępnych jednostek tego typu. Nie jest to lista konkretnych mieszkań, biur ani działek.
- realty-feed: główny kontener całego feedu XML. Główne ID: —
- offers: jeden projekt lub kompleks. Główne ID: complex-id
- layouts: typowy układ w projekcie. Główne ID: id
- payment_plans: jedna opcja płatności dla projektu. Główne ID: id
- eoi_item: jeden warunek EOI. Główne ID: —
- stock: kampania marketingowa, aktualność lub komunikat promocyjny od dewelopera. Główne ID: —
1.1 Czym jest feed XML
Feed XML to uporządkowany plik zawierający dane o projektach nieruchomości i typowych układach. Obejmuje opisy, zdjęcia, ceny, adresy, statusy, specyfikacje, udogodnienia i inne dane potrzebne do prezentacji ofert na stronie agencji lub w katalogu.
W uproszczeniu feed XML to strumień danych o nieruchomościach, który system odbierający regularnie pobiera, odczytuje i wykorzystuje do automatycznej aktualizacji kart ofert.
Alnair dostarcza dane. Za rozwój strony, rozwój katalogu, integrację z CRM oraz logikę importu odpowiada klient lub jego zespół techniczny.
1.2 Czego potrzebuje agencja
Aby korzystać z feedu XML, agencja potrzebuje własnej infrastruktury technicznej, która będzie regularnie pobierać XML, analizować jego strukturę i aktualizować dane w systemie.
- Strona internetowa lub katalog nieruchomości: miejsce, w którym będą prezentowane projekty i układy z feedu.
- Zespół techniczny lub programista: konfiguracja pobierania XML, parsowania i importu.
- Parser XML: odczyt struktury XML i konwersja do wewnętrznego modelu danych.
- Moduł importu: tworzenie, aktualizacja i dezaktywacja projektów oraz układów.
- Harmonogram zadań: regularne uruchamianie importu według harmonogramu, np. przez cron lub scheduler.
- Logowanie błędów: monitorowanie nieznanych wartości enum, pustych pól i błędów ładowania.
1.3 Jak agencja korzysta z feedu XML
Typowy proces wygląda następująco:
- System agencji pobiera XML z osobistego linku internetowego.
- XML jest zapisywany jako surowy zrzut do diagnostyki i ponownego przetwarzania.
- Parser odczytuje strukturę realty-feed, offers, layouts oraz zagnieżdżone bloki.
- Moduł importu tworzy nowe projekty i układy albo aktualizuje istniejące.
- Obiekty, które zniknęły z nowego feedu, są oznaczane jako nieaktywne.
- Strona agencji wyświetla aktualne karty projektów, ceny, galerie i statusy.
Główne możliwości integracji:
- Automatyczne aktualizacje: projekty i układy są aktualizowane bez ręcznej ingerencji.
- Tworzenie kart nieruchomości: dane z feedu służą do kart projektów i układów.
- Aktualne ceny i statusy: strona otrzymuje aktualizacje XML zgodnie z harmonogramem.
- Filtry i wyszukiwanie: do filtrowania można wykorzystać dzielnicę, cenę, typ nieruchomości, liczbę pokoi i metraż.
- Galerie multimediów: można wyświetlać zdjęcia projektu, galerie tematyczne i wizualizacje układów.
2. Ogólna struktura XML
<realty-feed>
<generation-date>2026-06-17T12:06:39+04:00</generation-date>
<offers>...</offers>
<offers>...</offers>
</realty-feed>
- realty-feed: obiekt. Główny blok feedu.
- generation-date: datetime. Data i godzina wygenerowania XML. Służy do sprawdzania świeżości danych.
- offers: object[]. Lista projektów lub kompleksów. Każdy blok offers zawiera dane projektu i jego układy.
2.1 Dostęp do feedu i limity pobierania
Feed jest udostępniany klientowi poprzez osobisty link internetowy. Link jest unikalny dla klienta i służy systemowi odbierającemu do automatycznego pobierania XML.
Link osobisty jest dostępny dla administratora na koncie Alnair. Administrator może przekazać go zespołowi technicznemu klienta w celu skonfigurowania importu.
- Rodzaj dostępu: osobisty link internetowy. Indywidualny adres URL feedu XML dla klienta.
- Skąd wziąć link: konto Alnair. Link jest dostępny dla administratora klienta.
- Częstotliwość aktualizacji feedu: co 4 godziny. Dane XML są aktualizowane po stronie Alnair raz na 4 godziny.
- Minimalny odstęp pobierania: nie częściej niż raz na godzinę. System odbierający nie może odpytywać feedu częściej niż raz na godzinę.
- Przekroczenie limitu: blokada dostępu. Zbyt częste zapytania mogą spowodować tymczasową blokadę dostępu do feedu.
Zalecana logika integracji: skonfiguruj harmonogram pobierania przez cron lub scheduler, zapisuj ostatnio odebrany XML i nie pobieraj feedu przy każdym odświeżeniu strony. Optymalny tryb to pobieranie feedu nie częściej niż raz na godzinę, z uwzględnieniem, że nowe dane pojawiają się mniej więcej co 4 godziny.
3. Projekt: <offers>
offers to główny element feedu. Zawiera opis projektu, dewelopera, lokalizację, status budowy i sprzedaży, ceny, multimedia, udogodnienia, plany płatności, EOI, promocje marketingowe oraz typowe układy.
<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: integer. Unikalne ID projektu w Alnair. Używaj jako zewnętrznego ID projektu do upsertu.
- type: enum. Typ encji najwyższego poziomu: project lub compound. Zapisz surową wartość i importuj jako projekt główny.
- logo: url. Logo projektu. Wyświetlaj w brandingu, nie używaj jako okładki.
- photo: url. Główne zdjęcie projektu / okładka. Używaj jako zdjęcie okładkowe i hero image.
- title: localized object. Nazwa projektu w en/ru/ar. Wyświetlaj zgodnie z językiem interfejsu.
- description: localized HTML. Opis projektu w en/ru/ar. Renderuj bezpiecznie; HTML znajduje się w CDATA.
- price_on_request: 0/1. Flaga ukrywania ceny. Jeśli 1, pokaż „Cena na zapytanie”.
- status: object. Status budowy. Nie mylić z sales_status.
- construction_start_at: datetime. Data rozpoczęcia budowy. Wyświetlaj, jeśli uzupełniona.
- construction_progress: decimal. Procent zaawansowania budowy. Wyświetlaj jako procent.
- planned_completion_at: datetime. Planowana data zakończenia projektu. Używaj jako daty przekazania.
- predicted_completion_at: datetime. Przewidywana data zakończenia. Może służyć jako zaktualizowana data ukończenia.
- amenities: object. Udogodnienia i cechy projektu. Mapuj po kluczu.
- developer: object. Deweloper projektu. Zapisz nazwę i logo.
- city / address: string. Miasto i adres projektu. Używaj w danych lokalizacji.
- latitude / longitude: decimal. Współrzędne. Używaj na mapie.
- districts: object. Dzielnice projektu. Używaj w filtrach i na karcie projektu.
- album: object. Główna, niesklasyfikowana galeria projektu. Pokazuj jako ogólną galerię.
- albums: object. Galerie tematyczne projektu. Grupuj po tytule.
- for_sale_count: integer. Liczba dostępnych jednostek w projekcie. Może być wyświetlana jako dostępność.
- price: object. Ogólny zakres cen projektu. Ukryj, gdy price_on_request=1.
- br_prices: object[]. Ceny według liczby sypialni lub kategorii. Używaj w filtrach i listingach.
- updated_at: datetime. Data aktualizacji projektu. Używaj do synchronizacji.
- is_sold_out: 0/1. Flaga wyprzedania. Używaj razem z sales_status.
- payment_plans: object[]. Opcje płatności od dewelopera. Wyświetlaj jako opcje płatności.
- sales_status: localized object. Status sprzedaży projektu. Określa etap sprzedaży.
- stocks: object. Kampanie marketingowe i komunikaty promocyjne od dewelopera. Wyświetlaj jako bloki promocyjne.
- eoi: object. Expression of Interest. Wyświetlaj tylko dla Presale (EOI).
- service_charge: object. Opłata serwisowa. Wyświetlaj, jeśli wartość jest uzupełniona.
- assignment: decimal. Warunek cesji. Puste oznacza brak określenia.
- is_limited_publication: 0/1. Ograniczenie publikacji. Jeśli 1, nie publikuj publicznie bez zgody.
- layouts: object[]. Typowe układy projektu. Importuj jako encje podrzędne projektu.
4. Pola lokalizowane
Pola lokalizowane mają tę samą strukturę: wartości w języku angielskim, rosyjskim i arabskim przekazywane są wewnątrz znacznika.
<title>
<en>Nazwa projektu</en>
<ru>Название проекта</ru>
<ar>اسم المشروع</ar>
</title>
- en: wartość angielska. Zalecany fallback.
- ru: wartość rosyjska.
- ar: wartość arabska.
Zasada fallback:
- Użyj języka interfejsu, jeśli jest uzupełniony.
- Jeśli wymagany język jest pusty, użyj en.
- Jeśli en jest pusty, użyj ru.
- Jeśli ru jest pusty, użyj ar.
- Jeśli wszystkie wartości są puste, nie wyświetlaj pola.
5. Statusy
5.1 Status budowy: <status>
Status budowy pokazuje fizyczny stan projektu. Nie oznacza dostępności sprzedaży.
<status>
<key>development_stage_progress</key>
<en>W trakcie realizacji</en>
<ru>Строится</ru>
<ar>قيد الإنشاء</ar>
</status>
- Scheduled: projekt jest zaplanowany.
- In Progress: budowa jest w toku.
- Ready: projekt jest ukończony.
- Stopped: budowa została wstrzymana.
5.2 Status sprzedaży: <sales_status>
Status sprzedaży pokazuje etap komercyjny projektu: ogłoszenie, presale, start, aktywna sprzedaż lub wyprzedanie.
- Preliminary Info: wstępne informacje o projekcie.
- Announcement: projekt został ogłoszony.
- Presale (EOI): trwa zbieranie EOI.
- Launch: rozpoczęcie sprzedaży.
- On Sale: projekt jest dostępny do zakupu.
- Sold Out: projekt został wyprzedany.
- Pending: status oczekuje na aktualizację.
6. Deweloper i lokalizacja
Te bloki są potrzebne do wyświetlenia marki dewelopera oraz położenia geograficznego projektu.
<developer>
<title>
<en>Nazwa dewelopera</en>
<ru>Developer Name</ru>
<ar>Developer Name</ar>
</title>
<logo>https://...</logo>
</developer>
<city>Dubai</city>
<address>Adres projektu, Dubai</address>
<latitude>25.01809076</latitude>
<longitude>55.13354525</longitude>
<districts>
<district>Jumeirah Village Triangle (JVT)</district>
</districts>
- developer.title: localized object. Nazwa dewelopera.
- developer.logo: url. Logo dewelopera.
- city: string. Miasto.
- address: string. Adres.
- latitude / longitude: decimal. Współrzędne na mapę.
- districts.district: string[]. Dzielnice projektu.
7. Ceny
7.1 Cena projektu: <price>
Cena na poziomie projektu pokazuje ogólny zakres cen dostępnych ofert w projekcie.
<price>
<min>815462</min>
<max>2089780</max>
<min_usd>222009</min_usd>
<max_usd>568942</max_usd>
<currency>AED</currency>
</price>
- min: decimal. Minimalna cena.
- max: decimal. Maksymalna cena.
- min_usd: decimal. Minimalna cena w USD.
- max_usd: decimal. Maksymalna cena w USD.
- currency: enum. Główna waluta, zwykle AED.
Jeśli price_on_request = 1, dokładne ceny nie są wyświetlane publicznie, nawet jeśli cena jest uzupełniona.
7.2 Ceny według kategorii: <br_prices>
br_prices grupuje ceny i powierzchnie według liczby sypialni lub typu nieruchomości. Jest to przydatne dla filtrów i krótkich kart projektu.
<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: kawalerki.
- 1-6: liczba sypialni.
- villa: wille.
- townhouse: domy szeregowe.
- n: nie dotyczy / kategoria niemieszkalna / inne.
8. Multimedia
Multimedia w feedzie są podzielone na kilka typów. Nie należy ich łączyć w jedną galerię bez uwzględnienia ich przeznaczenia: jedno zdjęcie może być okładką projektu, inne logo, jeszcze inne materiałem promocyjnym albo rzutem.
- logo: offers.logo. Logo projektu. Pokazuj w brandingu projektu; nie używaj jako okładki.
- photo: offers.photo. Główne zdjęcie projektu / okładka. Używaj jako zdjęcie okładkowe w karcie i hero image na stronie projektu.
- album.image: offers.album.image. Główna, nieskategoryzowana galeria projektu. Pokazuj w ogólnej galerii projektu.
- albums.album.images.image: offers.albums.album.images.image. Tematyczna galeria projektu. Grupuj według albums.album.title.
- developer.logo: offers.developer.logo. Logo dewelopera. Pokazuj w bloku dewelopera.
- stocks.stock.logo: offers.stocks.stock.logo. Obraz kampanii marketingowej. Pokazuj wewnątrz bloku promocji.
- layouts.album.image: offers.layouts.album.image. Galeria konkretnego typowego układu. Pokazuj na poziomie układu.
- levels_photos.level_photo.image: offers.layouts.levels_photos.level_photo.image. Zdjęcie układu według poziomu. Używaj jako rzut.
<photo>https://...</photo>
<album>
<image>https://...</image>
</album>
<albums>
<album>
<title><en>Infrastruktura</en><ru>Инфраструктура</ru><ar>...</ar></title>
<images>
<image>https://...</image>
</images>
</album>
</albums>
- Prezentacja projektu: zdjęcia prezentacyjne projektu.
- Postęp budowy: zdjęcia z postępu budowy.
- Przykłady wykończenia: przykłady wykończenia.
- Infrastruktura: infrastruktura projektu.
- Widok: widoki i otoczenie.
Nie każda kategoria musi występować w każdym projekcie. Jeśli tytuł kategorii jest pusty, obrazy można importować jako nieskategoryzowane lub umieścić w ogólnej galerii.
W obecnej strukturze nie ma osobnego tagu XML historii/story. Aktualności, komunikaty promocyjne i materiały marketingowe projektu przekazywane są przez stocks. Do historii budowy można wykorzystać kategorię Postęp budowy, jeśli występuje w albums.
9. Udogodnienia
amenities opisuje udogodnienia i cechy projektu. Do integracji najlepiej używać key, natomiast wartości lokalizowane wykorzystywać do wyświetlania.
<amenities>
<amenity>
<key>project_facilities_gym</key>
<en>Siłownia</en>
<ru>Тренажёрный зал</ru>
<ar>صالة رياضية</ar>
</amenity>
</amenities>
- amenities: object. Kontener udogodnień.
- amenity: object. Jedno udogodnienie.
- key: enum. Klucz techniczny.
- en / ru / ar: string. Nazwa udogodnienia w trzech językach.
Klucz projecet_hotel_license zawiera literówkę, ale musi być mapowany jako Hotel License. Zaleca się obsługę aliasu i niewstrzymywanie importu.
10. Promocje marketingowe: <stocks>
stocks to kampanie marketingowe, aktualności i komunikaty promocyjne od deweloperów. Mogą zawierać ceny specjalne, rabaty, warunki startu sprzedaży, ogłoszenia EOI, czasowe oferty płatności i materiały reklamowe. Ten blok nie jest stanem magazynowym i nie definiuje dostępności jednostek.
<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: object. Kontener komunikatów marketingowych.
- stock: object. Jedna kampania, aktualność lub ogłoszenie promocyjne.
- title: localized object. Tytuł promocji.
- description: localized HTML. Opis promocji.
- start_at: datetime. Data rozpoczęcia.
- end_at: datetime. Data zakończenia; może być pusta.
- logo: url. Obraz promocji.
Do określania dostępności nieruchomości używaj for_sale_count, layouts.sale_units_count i sales_status, a nie stocks.
11. EOI
EOI oznacza Expression of Interest. Blok opisuje wstępne zainteresowanie lub warunki wpłaty depozytu dla projektów ze statusem Presale (EOI).
<eoi>
<is_eoi_return>0</is_eoi_return>
<eoi_items>
<eoi_item>
<price>100000</price>
<percent/>
<description>
<en>Kwota EOI dla 2 Bedrooms</en>
<ru>Сумма EOI для 2-комнатных</ru>
<ar>...</ar>
</description>
</eoi_item>
</eoi_items>
</eoi>
- is_eoi_return: 0/1/empty. 0 = bezzwrotne, 1 = zwrotne, empty = nieokreślone.
- eoi_items: object. Kontener warunków EOI.
- eoi_item: object. Jeden warunek EOI.
- price: decimal. Stała kwota EOI.
- percent: decimal. Procent EOI, jeśli używany.
- description: localized object. Opis warunku.
- sales_status.en = Presale (EOI) i eoi_items jest uzupełnione: pokaż EOI.
- Każdy inny sales_status: ukryj EOI.
12. Opłata serwisowa i cesja
<service_charge>
<value>172.22</value>
<unit>sq. m</unit>
<currency>AED</currency>
</service_charge>
<assignment>40.00</assignment>
- service_charge.value: kwota opłaty serwisowej. Jeśli puste, nie pokazuj bloku.
- service_charge.unit: jednostka obliczeń, zwykle sq. m. Może być pusta.
- service_charge.currency: waluta, zwykle AED. Może być pusta.
- assignment: procent, po którym możliwa jest cesja. Puste = brak informacji, nie ograniczenie.
13. Plany płatności: <payment_plans>
payment_plans opisuje opcje płatności za nieruchomość oferowane przez dewelopera. Jeden projekt może mieć kilka planów płatności. Każdy plan rozbija płatność na etapy: rezerwacja, budowa, przekazanie i po przekazaniu. Opłaty i dodatkowe koszty są przekazywane oddzielnie, więc łączny procent może przekraczać 100%. Na przykład 104% może oznaczać 100% ceny nieruchomości + 4% opłaty DLD.
- Podstawowe: id, title, currency. Identyfikator planu, tytuł i waluta. title to tekst swobodny, nie enum.
- Rezerwacja: on_booking_percent, on_booking_fix, on_booking_payments_count, on_booking_fees. Płatności i opłaty na etapie rezerwacji.
- Budowa: on_construction_percent, on_construction_fix, on_construction_payments_count, on_construction_fees. Płatności w trakcie budowy.
- Przekazanie: on_handover_percent, on_handover_fix, on_handover_payments_count, on_handover_fees. Płatności przy przekazaniu nieruchomości.
- Po przekazaniu: post_handover_percent, post_handover_fix, on_post_handover_payments_count, on_post_handover_fees. Płatności po przekazaniu.
- ROI: roi_percent, roi_fix, roi_payments_count, roi_fees. Pola dla schematów ROI lub gwarantowanego dochodu.
- Dodatkowe opłaty: additional, additional_percent, additional_fix, additional_fix_m2. Dodatkowe płatności, np. DLD Fee.
- Okresy: period_after_handover, period_after_roi. Częstotliwość płatności cyklicznych.
- Suma: price_total, fees_included_total. Łączne kwoty planu i uwzględnione opłaty.
14. Układy: <layouts>
layouts opisuje typowy układ w obrębie projektu. Jest to zagregowany typ jednostki, a nie konkretne mieszkanie czy biuro.
- id: integer. Unikalne ID układu. Używaj jako zewnętrznego ID układu.
- title: localized object. Nazwa układu. Wyświetlaj zgodnie z językiem interfejsu.
- project_id: integer. ID projektu nadrzędnego. Połącz z offers.complex-id.
- building_name: localized object. Nazwa budynku. Nie wyświetlaj, jeśli pusta.
- price_on_request: 0/1. Flaga ukrywania ceny. Jeśli 1, nie pokazuj ceny.
- area_min / area_max: object. Zakres powierzchni. m2 i ft2.
- area_balcony_min / area_balcony_max: object. Zakres powierzchni balkonu. Może być pusty.
- type: localized object. Typ nieruchomości. Zobacz referencję typów jednostek.
- sale_units_count: integer. Liczba dostępnych jednostek tego typu. Nie jest to lista lokali.
- album: object. Galeria układu. Pokazuj na poziomie układu.
- levels_photos: object. Zdjęcia według poziomu. Używaj jako rzuty.
- floors_count: integer. Liczba kondygnacji. 1, 2, 3 itd.
- rooms_count: localized object. Liczba pokoi. Zobacz referencję liczby pokoi.
- price: object. Zakres cen układu. Ukryj, gdy price_on_request=1.
- is_limited_publication: 0/1. Ograniczenie publikacji. Jeśli 1, ukryj publicznie.
15. Referencje wartości enum
- Typ projektu: project, compound.
- Status sprzedaży: Preliminary Info, Announcement, Presale (EOI), Launch, On Sale, Sold Out, Pending.
- Status budowy: Scheduled, Ready, Stopped, In Progress.
- Typ jednostki: Apartment, Villa, Townhouse, Duplex, Triplex, Penthouse, Retail, Office, Suite.
- Liczba pokoi: Studio, 1 BR, 2 BR, 3 BR, 4 BR, 5 BR, 6 BR, 7 BR, 8 BR, NA.
- Klucz ceny BR: studio, 1, 2, 3, 4, 5, 6, villa, townhouse, n.
- Kategoria galerii: Prezentacja projektu, Postęp budowy, Przykłady wykończenia, Infrastruktura, Widok.
- Waluta: AED.
- Jednostka opłaty serwisowej: sq. m.
- Flagi logiczne: 0, 1; dla niektórych pól dopuszczalne jest pole puste.
Jeśli feed zawiera wartość, której nie ma na liście referencyjnej, import nie może się nie powieść. Wartość należy zapisać jako surową, oznaczyć jako nieznaną i zalogować do weryfikacji.
16. Puste wartości
Pusta wartość oznacza „nieokreślone”, a nie 0. Puste znaczniki mogą wyglądać jak <field/> lub <field></field>.
- assignment: warunek cesji nie jest określony.
- service_charge.value: opłata serwisowa nie jest określona.
- eoi.is_eoi_return: zwrotność EOI nie jest określona.
- area_balcony_min.m2: powierzchnia balkonu nie jest określona.
- description.en: brak opisu.
17. Zasady wyświetlania
- Cena ukryta: price_on_request = 1. Pokaż „Cena na zapytanie”.
- Cena widoczna: price_on_request = 0. Pokaż cenę min/max.
- EOI: sales_status.en = Presale (EOI) i EOI jest uzupełnione. Pokaż EOI.
- EOI nie dotyczy: sales_status.en != Presale (EOI). Ukryj EOI.
- Wyprzedane: is_sold_out = 1 lub sales_status.en = Sold Out. Pokaż „Wyprzedane” lub ukryj z listingu.
- Ograniczona publikacja: is_limited_publication = 1. Nie publikuj publicznie.
- Pusta cesja: assignment puste. Nie pokazuj bloku cesji.
- Pusta opłata serwisowa: service_charge.value puste. Nie pokazuj opłaty serwisowej.
18. Zasady importu
- Projekt: wyszukaj po complex-id; jeśli znaleziony, zaktualizuj; jeśli nie, utwórz.
- Układ: wyszukaj po layouts.id; połącz z projektem przez project_id.
- Usuwanie: jeśli obiekt zniknie z nowego feedu, oznacz go jako nieaktywny zamiast usuwać od razu.
- Nieznany enum: zapisz surową wartość, oznacz jako nieznaną i zaloguj.
- Puste wartości: nie zamieniaj ich na 0 bez wyraźnej reguły dla danego pola.
19. Zalecana struktura danych
Pole projektu → Źródło
- 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.
Pole układu → Źródło
- 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.