ฟีด XML สำหรับโครงการและแบบห้องพัก
1. วัตถุประสงค์ของ Feed
XML feed ใช้ส่งต่อข้อมูลแบบมีโครงสร้างเกี่ยวกับโครงการอสังหาริมทรัพย์และแบบห้องมาตรฐาน จุดประสงค์คือให้ระบบปลายทางสามารถสร้างและอัปเดตการ์ดโครงการ แสดงราคา สถานะ แกลเลอรี สิ่งอำนวยความสะดวก เงื่อนไขการชำระเงิน EOI และสื่อโปรโมชันจากผู้พัฒนาได้โดยอัตโนมัติ
feed จะส่งข้อมูล layout ในรูปแบบรวม กล่าวคือ 1 รายการ layout แทนแบบห้องมาตรฐานหนึ่งประเภท พร้อมจำนวนยูนิตที่เปิดขายของประเภทนั้น ไม่ใช่รายการอพาร์ตเมนต์ ออฟฟิศ หรือที่ดินแปลงใดแปลงหนึ่งโดยเฉพาะ
- realty-feed: คอนเทนเนอร์หลักของ XML feed ทั้งหมด Main ID: —
- offers: โครงการหรือคอมเพล็กซ์หนึ่งโครงการ Main ID: complex-id
- layouts: แบบห้องมาตรฐานภายในโครงการ Main ID: id
- payment_plans: ตัวเลือกการชำระเงินของหนึ่งโครงการ Main ID: id
- eoi_item: เงื่อนไข EOI หนึ่งรายการ Main ID: —
- stock: แคมเปญการตลาด ข่าวสาร หรือข้อความโปรโมชันจากผู้พัฒนา Main ID: —
1.1 XML Feed คืออะไร
XML feed คือไฟล์ข้อมูลแบบมีโครงสร้างที่บรรจุข้อมูลเกี่ยวกับโครงการอสังหาริมทรัพย์และแบบห้องมาตรฐาน ภายในมีรายละเอียด รูปภาพ ราคา ที่อยู่ สถานะ สเปก สิ่งอำนวยความสะดวก และข้อมูลอื่น ๆ ที่จำเป็นต่อการแสดงทรัพย์สินบนเว็บไซต์เอเจนซี่หรือในแคตตาล็อก
พูดง่าย ๆ คือ XML feed เป็นสตรีมข้อมูลอสังหาริมทรัพย์ที่ระบบปลายทางดาวน์โหลด อ่าน และใช้เพื่ออัปเดตการ์ดทรัพย์สินโดยอัตโนมัติเป็นระยะ
Alnair เป็นผู้จัดเตรียมข้อมูล ส่วนการพัฒนาเว็บไซต์ การทำแคตตาล็อก การเชื่อมต่อ CRM และตรรกะการนำเข้าข้อมูลเป็นหน้าที่ของลูกค้าหรือทีมเทคนิคของลูกค้า
1.2 สิ่งที่เอเจนซี่ต้องมี
ในการใช้งาน XML feed เอเจนซี่ต้องมีโครงสร้างพื้นฐานทางเทคนิคของตนเองที่สามารถดาวน์โหลด XML เป็นประจำ แยกโครงสร้างข้อมูล และอัปเดตข้อมูลในระบบได้
- เว็บไซต์หรือแคตตาล็อกอสังหาริมทรัพย์: พื้นที่ที่จะแสดงโครงการและ layout จาก feed
- ทีมเทคนิคหรือผู้พัฒนา: ตั้งค่าการดาวน์โหลด XML การแยกข้อมูล และการนำเข้า
- XML parser: อ่านโครงสร้าง XML และแปลงเป็นโมเดลข้อมูลภายใน
- โมดูลนำเข้า: สร้าง อัปเดต และปิดการแสดงผลโครงการและ layout
- ตัวตั้งเวลางาน: เรียกใช้งานนำเข้าแบบกำหนดเวลา เช่น ผ่าน cron หรือ scheduler
- บันทึกข้อผิดพลาด: ตรวจสอบค่า enum ที่ไม่รู้จัก ฟิลด์ว่าง และข้อผิดพลาดในการโหลด
1.3 เอเจนซี่ใช้งาน XML Feed อย่างไร
เวิร์กโฟลว์ทั่วไปมีดังนี้:
- ระบบของเอเจนซี่ดาวน์โหลด XML จากลิงก์เว็บส่วนตัว
- บันทึก XML เป็น snapshot ดิบสำหรับการวิเคราะห์และประมวลผลซ้ำ
- parser อ่านโครงสร้าง realty-feed, offers, layouts และบล็อกย่อยต่าง ๆ
- โมดูลนำเข้าสร้างโครงการและ layout ใหม่ หรืออัปเดตข้อมูลเดิม
- รายการที่หายไปจาก feed ใหม่จะถูกทำเครื่องหมายเป็น inactive
- เว็บไซต์ของเอเจนซี่แสดงการ์ดโครงการ ราคา แกลเลอรี และสถานะที่อัปเดตล่าสุด
ความสามารถหลักในการเชื่อมต่อ:
- อัปเดตอัตโนมัติ: โครงการและ layout ถูกอัปเดตโดยไม่ต้องป้อนข้อมูลเอง
- สร้างหน้าโครงการ: ใช้ข้อมูลจาก feed ในการสร้างการ์ดโครงการและ layout
- ราคาและสถานะล่าสุด: เว็บไซต์รับการอัปเดต XML ตามรอบเวลา
- ตัวกรองและการค้นหา: ใช้เขต ราคา ประเภททรัพย์สิน จำนวนห้อง และพื้นที่สำหรับการกรอง
- แกลเลอรีสื่อ: แสดงรูปโครงการ แกลเลอรีธีม และรูปแบบ layout ในอินเทอร์เฟซได้
2. โครงสร้าง XML ทั่วไป
<realty-feed>
<generation-date>2026-06-17T12:06:39+04:00</generation-date>
<offers>...</offers>
<offers>...</offers>
</realty-feed>
- realty-feed: object. บล็อกหลักของ feed
- generation-date: datetime. วันที่และเวลาที่สร้าง XML ใช้ตรวจสอบความใหม่ของข้อมูล
- offers: object[]. รายการโครงการหรือคอมเพล็กซ์ แต่ละบล็อก offers จะมีข้อมูลโครงการและ layouts ภายใน
2.1 การเข้าถึง Feed และข้อจำกัดในการดาวน์โหลด
feed จะถูกส่งให้ลูกค้าผ่านลิงก์เว็บส่วนตัว ลิงก์นี้เป็นลิงก์เฉพาะของลูกค้า และระบบปลายทางใช้สำหรับดาวน์โหลด XML แบบอัตโนมัติ
ลิงก์ส่วนตัวนี้มีให้ผู้ดูแลระบบในบัญชี Alnair ผู้ดูแลระบบสามารถส่งต่อให้ทีมเทคนิคของลูกค้าเพื่อใช้ตั้งค่าการนำเข้า
- ประเภทการเข้าถึง: ลิงก์เว็บส่วนตัว URL ของ XML feed เฉพาะลูกค้า
- แหล่งที่ได้ลิงก์: บัญชี Alnair ลิงก์นี้มีให้ผู้ดูแลของลูกค้า
- ความถี่ในการอัปเดต feed: ทุก 4 ชั่วโมง ข้อมูล XML จะอัปเดตฝั่ง Alnair ทุก 4 ชั่วโมง
- ช่วงเวลาขั้นต่ำในการดาวน์โหลด: ไม่เกิน 1 ครั้งต่อชั่วโมง ระบบปลายทางต้องไม่เข้าถึง feed เกิน 1 ครั้งต่อชั่วโมง
- เกินขีดจำกัด: การบล็อกการเข้าถึง หากมีการร้องขอบ่อยเกินไป อาจถูกบล็อกการเข้าถึง feed ชั่วคราว
แนวทางการเชื่อมต่อที่แนะนำ: ตั้งค่าการดาวน์โหลดแบบกำหนดเวลาผ่าน cron หรือ scheduler บันทึก XML ล่าสุดที่ได้รับไว้ และไม่ควรร้องขอ feed ทุกครั้งที่หน้าเว็บไซต์โหลด แนวทางที่เหมาะสมคือดาวน์โหลด feed ไม่เกิน 1 ครั้งต่อชั่วโมง โดยคำนึงว่าข้อมูลใหม่จะปรากฏประมาณทุก 4 ชั่วโมง
3. โครงการ: <offers>
offers คือเอนทิตีหลักของ feed ภายในมีคำอธิบายโครงการ ผู้พัฒนา ที่ตั้ง สถานะก่อสร้างและการขาย ราคา สื่อ สิ่งอำนวยความสะดวก แผนชำระเงิน EOI โปรโมชันทางการตลาด และแบบห้องมาตรฐาน
<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. รหัสโครงการเฉพาะใน Alnair ใช้เป็นรหัสโครงการภายนอกสำหรับ upsert
- type: enum. ประเภทเอนทิตีระดับบนสุด: project หรือ compound เก็บค่าดิบและนำเข้าเป็นโครงการระดับบนสุด
- logo: url. โลโก้โครงการ แสดงในส่วนแบรนด์ ไม่ใช้เป็นภาพปก
- photo: url. รูปหลักของโครงการ / ภาพปก ใช้เป็นภาพปกและภาพ hero
- title: localized object. ชื่อโครงการใน en/ru/ar แสดงตามภาษาของอินเทอร์เฟซ
- description: localized HTML. คำอธิบายโครงการใน en/ru/ar แสดงผลอย่างปลอดภัย โดย HTML อยู่ใน CDATA
- price_on_request: 0/1. ตัวบอกการซ่อนราคา หากเป็น 1 ให้แสดง “Price on request”
- status: object. สถานะการก่อสร้าง อย่าสับสนกับ sales_status
- construction_start_at: datetime. วันที่เริ่มก่อสร้าง แสดงหากมีค่า
- construction_progress: decimal. เปอร์เซ็นต์ความคืบหน้าการก่อสร้าง แสดงเป็นเปอร์เซ็นต์
- planned_completion_at: datetime. วันที่คาดว่าจะแล้วเสร็จของโครงการ ใช้เป็นวันส่งมอบ
- predicted_completion_at: datetime. วันที่คาดว่าจะแล้วเสร็จ สามารถใช้เป็นวันที่อัปเดตได้
- amenities: object. สิ่งอำนวยความสะดวกและฟีเจอร์ของโครงการ แมปตาม key
- developer: object. ผู้พัฒนาโครงการ เก็บชื่อและโลโก้
- city / address: string. เมืองและที่อยู่ของโครงการ ใช้ในข้อมูลทำเล
- latitude / longitude: decimal. พิกัด ใช้สำหรับแผนที่
- districts: object. เขตของโครงการ ใช้สำหรับตัวกรองและการ์ดโครงการ
- album: object. แกลเลอรีหลักของโครงการแบบไม่แยกหมวด แสดงเป็นแกลเลอรีทั่วไป
- albums: object. แกลเลอรีโครงการแบบมีธีม จัดกลุ่มตาม title
- for_sale_count: integer. จำนวนยูนิตที่ยังเปิดขายในโครงการ แสดงเป็นความพร้อมขายได้
- price: object. ช่วงราคาทั่วไปของโครงการ ซ่อนเมื่อ price_on_request=1
- br_prices: object[]. ราคาตามจำนวนห้องนอนหรือประเภท ใช้สำหรับตัวกรองและรายการประกาศ
- updated_at: datetime. วันที่อัปเดตโครงการ ใช้สำหรับการซิงก์
- is_sold_out: 0/1. ตัวบอก sold out ใช้ร่วมกับ sales_status
- payment_plans: object[]. ตัวเลือกการชำระเงินจากผู้พัฒนา แสดงเป็นตัวเลือกการชำระเงิน
- sales_status: localized object. สถานะการขายของโครงการ กำหนดระยะการขาย
- stocks: object. แคมเปญการตลาดและข้อความโปรโมชันจากผู้พัฒนา แสดงเป็นบล็อกโปรโมชัน
- eoi: object. Expression of Interest แสดงเฉพาะกรณี Presale (EOI)
- service_charge: object. ค่าบริการ แสดงหากมีการกรอกค่า
- assignment: decimal. เงื่อนไขการโอนสิทธิ์ หากว่างหมายถึงไม่ได้ระบุ
- is_limited_publication: 0/1. ข้อจำกัดการเผยแพร่ หากเป็น 1 ห้ามเผยแพร่สาธารณะโดยไม่ได้รับอนุญาต
- layouts: object[]. แบบห้องมาตรฐานของโครงการ นำเข้าเป็นเอนทิตีย่อยของโครงการ
4. ฟิลด์แบบหลายภาษา
ฟิลด์แบบหลายภาษามีโครงสร้างเหมือนกัน โดยค่าภาษาอังกฤษ รัสเซีย และอาหรับจะถูกส่งอยู่ภายในแท็ก
<title>
<en>ชื่อโครงการ</en>
<ru>Название проекта</ru>
<ar>اسم المشروع</ar>
</title>
- en: ค่าภาษาอังกฤษ แนะนำให้ใช้เป็น fallback
- ru: ค่าภาษารัสเซีย
- ar: ค่าภาษาอาหรับ
กฎการ fallback:
- ใช้ภาษาของอินเทอร์เฟซหากมีค่า
- หากภาษาที่ต้องการว่าง ให้ใช้ en
- หาก en ว่าง ให้ใช้ ru
- หาก ru ว่าง ให้ใช้ ar
- หากทั้งหมดว่าง ให้ไม่แสดงฟิลด์นั้น
5. สถานะ
5.1 สถานะการก่อสร้าง: <status>
สถานะการก่อสร้างแสดงสภาพทางกายภาพของโครงการ ไม่ได้บ่งบอกความพร้อมในการขาย
<status>
<key>development_stage_progress</key>
<en>กำลังก่อสร้าง</en>
<ru>Строится</ru>
<ar>قيد الإنشاء</ar>
</status>
- Scheduled: โครงการอยู่ในแผน
- In Progress: อยู่ระหว่างการก่อสร้าง
- Ready: โครงการแล้วเสร็จ
- Stopped: งานก่อสร้างหยุดชะงัก
5.2 สถานะการขาย: <sales_status>
สถานะการขายแสดงขั้นตอนเชิงพาณิชย์ของโครงการ: ประกาศ, presale, เปิดตัว, ขายอยู่, หรือ sold out
- Preliminary Info: ข้อมูลโครงการเบื้องต้น
- Announcement: โครงการได้รับการประกาศแล้ว
- Presale (EOI): อยู่ระหว่างรับ EOI
- Launch: เปิดขายแล้ว
- On Sale: โครงการพร้อมซื้อ
- Sold Out: โครงการขายหมดแล้ว
- Pending: รอการอัปเดตสถานะ
6. ผู้พัฒนาและทำเลที่ตั้ง
บล็อกเหล่านี้จำเป็นสำหรับการแสดงแบรนด์ผู้พัฒนาและตำแหน่งทางภูมิศาสตร์ของโครงการ
<developer>
<title>
<en>ชื่อผู้พัฒนา</en>
<ru>ชื่อผู้พัฒนา</ru>
<ar>ชื่อผู้พัฒนา</ar>
</title>
<logo>https://...</logo>
</developer>
<city>Dubai</city>
<address>ที่อยู่โครงการ, Dubai</address>
<latitude>25.01809076</latitude>
<longitude>55.13354525</longitude>
<districts>
<district>Jumeirah Village Triangle (JVT)</district>
</districts>
- developer.title: localized object. ชื่อผู้พัฒนา
- developer.logo: url. โลโก้ผู้พัฒนา
- city: string. เมือง
- address: string. ที่อยู่
- latitude / longitude: decimal. พิกัดสำหรับแผนที่
- districts.district: string[]. เขตของโครงการ
7. ราคา
7.1 ราคาโครงการ: <price>
ราคาระดับโครงการจะแสดงช่วงราคาทั่วไปของยูนิตที่เปิดขายในโครงการ
<price>
<min>815462</min>
<max>2089780</max>
<min_usd>222009</min_usd>
<max_usd>568942</max_usd>
<currency>AED</currency>
</price>
- min: decimal. ราคาต่ำสุด
- max: decimal. ราคาสูงสุด
- min_usd: decimal. ราคาต่ำสุดเป็น USD
- max_usd: decimal. ราคาสูงสุดเป็น USD
- currency: enum. สกุลเงินหลัก โดยทั่วไปคือ AED
หาก price_on_request = 1 จะไม่แสดงราคาที่แน่ชัดต่อสาธารณะ แม้ว่าจะมีการกรอกราคาไว้ก็ตาม
7.2 ราคาตามหมวดหมู่: <br_prices>
br_prices ใช้จัดกลุ่มราคาและพื้นที่ตามจำนวนห้องนอนหรือประเภททรัพย์สิน เหมาะสำหรับตัวกรองและการ์ดโครงการแบบย่อ
<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: สตูดิโอ
- 1-6: จำนวนห้องนอน
- villa: วิลล่า
- townhouse: ทาวน์เฮาส์
- n: ไม่เกี่ยวข้อง / ประเภทไม่ใช่ที่พักอาศัย / อื่น ๆ
8. สื่อ
สื่อใน feed แบ่งออกเป็นหลายประเภท และไม่ควรรวมเป็นแกลเลอรีเดียวโดยไม่คำนึงถึงวัตถุประสงค์: รูปหนึ่งอาจเป็นภาพปกโครงการ อีกภาพเป็นโลโก้ อีกภาพเป็นภาพโปรโมชัน และอีกภาพเป็นแปลนชั้น
- logo: offers.logo. โลโก้โครงการ แสดงในแบรนด์ของโครงการ ไม่ใช้เป็นภาพปก
- photo: offers.photo. รูปหลักของโครงการ / ภาพปก ใช้เป็นภาพปกในการ์ดและภาพ hero บนหน้าโครงการ
- album.image: offers.album.image. แกลเลอรีหลักของโครงการแบบไม่แยกหมวด แสดงในแกลเลอรีรวมของโครงการ
- albums.album.images.image: offers.albums.album.images.image. แกลเลอรีโครงการแบบมีธีม จัดกลุ่มตาม albums.album.title
- developer.logo: offers.developer.logo. โลโก้ผู้พัฒนา แสดงในบล็อกผู้พัฒนา
- stocks.stock.logo: offers.stocks.stock.logo. ภาพแคมเปญการตลาด แสดงภายในบล็อกโปรโมชัน
- layouts.album.image: offers.layouts.album.image. แกลเลอรีของ layout มาตรฐานแต่ละแบบ แสดงในระดับ layout
- levels_photos.level_photo.image: offers.layouts.levels_photos.level_photo.image. ภาพของ layout แยกตามระดับ ใช้เป็นแปลนชั้น
<photo>https://...</photo>
<album>
<image>https://...</image>
</album>
<albums>
<album>
<title><en>โครงสร้างพื้นฐาน</en><ru>Инфраструктура</ru><ar>...</ar></title>
<images>
<image>https://...</image>
</images>
</album>
</albums>
- Project presentation: ภาพนำเสนอโครงการ
- Construction progress: ภาพความคืบหน้าการก่อสร้าง
- Finishing examples: ตัวอย่างงานตกแต่งภายใน
- Infrastructure: โครงสร้างพื้นฐานของโครงการ
- View: วิวทิวทัศน์และสภาพแวดล้อม
ไม่จำเป็นต้องมีทุกหมวดในทุกโครงการ หากชื่อหมวดว่าง สามารถนำเข้ารูปภาพเป็นหมวดที่ไม่แยกประเภท หรือใส่ไว้ในแกลเลอรีทั่วไปได้
โครงสร้างปัจจุบันไม่มีแท็ก XML สำหรับ history/story แยกต่างหาก ข่าวสาร ข้อความโปรโมชัน และสื่อการตลาดของโครงการจะถูกส่งผ่าน stocks สำหรับประวัติการก่อสร้าง สามารถใช้หมวด Construction progress ได้หากมีอยู่ใน albums
9. สิ่งอำนวยความสะดวก
amenities อธิบายสิ่งอำนวยความสะดวกและฟีเจอร์ของโครงการ สำหรับการเชื่อมต่อ ควรใช้ key เป็นหลัก ส่วนค่าที่แปลเป็นภาษาต่าง ๆ ใช้สำหรับการแสดงผล
<amenities>
<amenity>
<key>project_facilities_gym</key>
<en>ห้องยิม</en>
<ru>Тренажёрный зал</ru>
<ar>صالة رياضية</ar>
</amenity>
</amenities>
- amenities: object. คอนเทนเนอร์ของสิ่งอำนวยความสะดวก
- amenity: object. สิ่งอำนวยความสะดวกหนึ่งรายการ
- key: enum. คีย์ทางเทคนิค
- en / ru / ar: string. ชื่อสิ่งอำนวยความสะดวกใน 3 ภาษา
คีย์ projecet_hotel_license มีการพิมพ์ผิด แต่ต้องแมปเป็น Hotel License แนะนำให้รองรับ alias นี้และไม่ทำให้การนำเข้าข้อมูลล้มเหลว
10. โปรโมชันการตลาด: <stocks>
stocks คือแคมเปญการตลาด ข่าวสาร และข้อความโปรโมชันจากผู้พัฒนา ซึ่งอาจรวมถึงราคาพิเศษ ส่วนลด เงื่อนไขเปิดตัว ประกาศ EOI ข้อเสนอการชำระเงินชั่วคราว และสื่อโฆษณา บล็อกนี้ไม่ใช่สต็อกสินค้าคงคลัง และไม่ได้ใช้กำหนดความพร้อมของยูนิต
<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. คอนเทนเนอร์ข้อความการตลาด
- stock: object. แคมเปญ ข่าวสาร หรือประกาศโปรโมชันหนึ่งรายการ
- title: localized object. ชื่อโปรโมชัน
- description: localized HTML. คำอธิบายโปรโมชัน
- start_at: datetime. วันที่เริ่มต้น
- end_at: datetime. วันที่สิ้นสุด อาจว่างได้
- logo: url. ภาพโปรโมชัน
ให้ใช้ for_sale_count, layouts.sale_units_count และ sales_status สำหรับความพร้อมขายของทรัพย์สิน ไม่ใช่ stocks
11. EOI
EOI หมายถึง Expression of Interest บล็อกนี้อธิบายเงื่อนไขความสนใจเบื้องต้นหรือเงินจองสำหรับโครงการที่อยู่ในสถานะ Presale (EOI)
<eoi>
<is_eoi_return>0</is_eoi_return>
<eoi_items>
<eoi_item>
<price>100000</price>
<percent/>
<description>
<en>จำนวน EOI สำหรับ 2 Bedrooms</en>
<ru>Сумма EOI для 2-комнатных</ru>
<ar>...</ar>
</description>
</eoi_item>
</eoi_items>
</eoi>
- is_eoi_return: 0/1/empty. 0 = ไม่คืนเงิน, 1 = คืนเงินได้, ว่าง = ไม่ได้ระบุ
- eoi_items: object. คอนเทนเนอร์เงื่อนไข EOI
- eoi_item: object. เงื่อนไข EOI หนึ่งรายการ
- price: decimal. จำนวน EOI แบบคงที่
- percent: decimal. เปอร์เซ็นต์ EOI หากมีการใช้
- description: localized object. คำอธิบายเงื่อนไข
- sales_status.en = Presale (EOI) และ eoi_items มีข้อมูล: แสดง EOI
- sales_status อื่นทั้งหมด: ซ่อน EOI
12. ค่าบริการและการโอนสิทธิ์
<service_charge>
<value>172.22</value>
<unit>sq. m</unit>
<currency>AED</currency>
</service_charge>
<assignment>40.00</assignment>
- service_charge.value: จำนวนค่าบริการ หากว่างไม่ต้องแสดงบล็อกนี้
- service_charge.unit: หน่วยคำนวณ โดยปกติคือ sq. m อาจว่างได้
- service_charge.currency: สกุลเงิน โดยทั่วไปคือ AED อาจว่างได้
- assignment: เปอร์เซ็นต์ที่สามารถโอนสิทธิ์ได้ หากว่าง = ไม่ได้ระบุ ไม่ใช่ข้อจำกัด
13. แผนการชำระเงิน: <payment_plans>
payment_plans อธิบายตัวเลือกการชำระเงินของทรัพย์สินจากผู้พัฒนา หนึ่งโครงการอาจมีหลายแผนการชำระเงิน แต่ละแผนแบ่งการชำระออกเป็นช่วงต่าง ๆ ได้แก่ จอง ก่อสร้าง ส่งมอบ และหลังส่งมอบ ค่าธรรมเนียมและค่าใช้จ่ายเพิ่มเติมจะถูกส่งแยกกัน ดังนั้นเปอร์เซ็นต์รวมอาจเกิน 100% ได้ เช่น 104% อาจหมายถึง 100% ของราคาทรัพย์สิน + ค่าธรรมเนียม DLD 4%
- Basic: id, title, currency. รหัสแผน ชื่อแผน และสกุลเงิน title เป็นข้อความอิสระ ไม่ใช่ enum
- Booking: on_booking_percent, on_booking_fix, on_booking_payments_count, on_booking_fees. การชำระและค่าธรรมเนียมในขั้นตอนจอง
- Construction: on_construction_percent, on_construction_fix, on_construction_payments_count, on_construction_fees. การชำระระหว่างก่อสร้าง
- Handover: on_handover_percent, on_handover_fix, on_handover_payments_count, on_handover_fees. การชำระในวันส่งมอบ
- Post-handover: post_handover_percent, post_handover_fix, on_post_handover_payments_count, on_post_handover_fees. การชำระหลังส่งมอบ
- ROI: roi_percent, roi_fix, roi_payments_count, roi_fees. ฟิลด์สำหรับแผน ROI หรือรายได้แบบรับประกัน
- Additional fees: additional, additional_percent, additional_fix, additional_fix_m2. การชำระเพิ่มเติม เช่น DLD Fee
- Periods: period_after_handover, period_after_roi. ความถี่ของการชำระซ้ำ
- Totals: price_total, fees_included_total. ยอดรวมของแผนและค่าธรรมเนียมที่รวมไว้
14. Layouts: <layouts>
layouts อธิบายแบบห้องมาตรฐานภายในโครงการ เป็นประเภทยูนิตแบบรวม ไม่ใช่อพาร์ตเมนต์หรือออฟฟิศเฉพาะเจาะจง
- id: integer. รหัส layout เฉพาะ ใช้เป็นรหัสภายนอกของ layout
- title: localized object. ชื่อ layout แสดงตามภาษาของอินเทอร์เฟซ
- project_id: integer. รหัสโครงการแม่ เชื่อมกับ offers.complex-id
- building_name: localized object. ชื่ออาคาร หากว่างไม่ต้องแสดง
- price_on_request: 0/1. ตัวบอกการซ่อนราคา หากเป็น 1 ไม่ต้องแสดงราคา
- area_min / area_max: object. ช่วงพื้นที่ m2 และ ft2
- area_balcony_min / area_balcony_max: object. ช่วงพื้นที่ระเบียง อาจว่างได้
- type: localized object. ประเภททรัพย์สิน ดู Unit type reference
- sale_units_count: integer. จำนวนยูนิตที่เปิดขายของประเภทนี้ ไม่ใช่รายการล็อต
- album: object. แกลเลอรีของ layout แสดงในระดับ layout
- levels_photos: object. รูปภาพแยกตามระดับ ใช้เป็นแปลนชั้น
- floors_count: integer. จำนวนชั้น 1, 2, 3 เป็นต้น
- rooms_count: localized object. จำนวนห้อง ดู Rooms count reference
- price: object. ช่วงราคาของ layout ซ่อนเมื่อ price_on_request=1
- is_limited_publication: 0/1. ข้อจำกัดการเผยแพร่ หากเป็น 1 ให้ซ่อนจากสาธารณะ
15. รายการอ้างอิงค่า 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: Project presentation, Construction progress, Finishing examples, Infrastructure, View.
- Currency: AED.
- Service charge unit: sq. m.
- Boolean flags: 0, 1; บางฟิลด์อนุญาตให้ว่างได้
หาก feed มีค่าที่ไม่อยู่ในรายการอ้างอิง การนำเข้าต้องไม่ล้มเหลว ค่านั้นต้องถูกเก็บเป็นค่าดิบ ทำเครื่องหมายว่าไม่รู้จัก และบันทึกไว้เพื่อให้ตรวจสอบภายหลัง
16. ค่าว่าง
ค่าว่างหมายถึง “ไม่ได้ระบุ” ไม่ใช่ 0 แท็กว่างอาจอยู่ในรูปแบบ <field/> หรือ <field></field>
- assignment: ไม่ได้ระบุเงื่อนไขการโอนสิทธิ์
- service_charge.value: ไม่ได้ระบุค่าบริการ
- eoi.is_eoi_return: ไม่ได้ระบุว่าสามารถคืน EOI ได้หรือไม่
- area_balcony_min.m2: ไม่ได้ระบุพื้นที่ระเบียง
- description.en: ไม่มีคำอธิบาย
17. กฎการแสดงผล
- ซ่อนราคา: price_on_request = 1 แสดง “Price on request”
- แสดงราคา: price_on_request = 0 แสดงราคา min/max
- EOI: sales_status.en = Presale (EOI) และมีข้อมูล EOI ให้แสดง EOI
- EOI ไม่เกี่ยวข้อง: sales_status.en != Presale (EOI) ให้ซ่อน EOI
- sold out: is_sold_out = 1 หรือ sales_status.en = Sold Out ให้แสดง “Sold out” หรือซ่อนจากรายการ
- จำกัดการเผยแพร่: is_limited_publication = 1 ห้ามเผยแพร่สาธารณะ
- assignment ว่าง: assignment ว่าง ไม่ต้องแสดงบล็อก assignment
- service charge ว่าง: service_charge.value ว่าง ไม่ต้องแสดงค่าบริการ
18. กฎการนำเข้า
- Project: ค้นหาด้วย complex-id ถ้าพบให้อัปเดต ถ้าไม่พบให้สร้างใหม่
- Layout: ค้นหาด้วย layouts.id และเชื่อมกับโครงการด้วย project_id
- การลบ: หากวัตถุหายไปจาก feed ใหม่ ให้ทำเครื่องหมายเป็น inactive แทนการลบทันที
- Unknown enum: เก็บค่าดิบ ทำเครื่องหมายว่าไม่รู้จัก และบันทึก
- ค่าว่าง: อย่าแปลงเป็น 0 หากไม่มี rule เฉพาะของฟิลด์นั้น
19. โครงสร้างข้อมูลที่แนะนำ
Project field → Source
- 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.
Layout field → Source
- 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.