สัญญาเชื่อมต่อ 1.1 · เว็บไซต์รุ่น 2.6.13
ERP ส่วนกลาง
เชื่อมยอดถึงลูกค้า
PetPOS ส่งผ่าน ERP สาขา / Branch Server ไปยัง ERP ส่วนกลาง ส่วนกลางเป็นผู้เรียก API เว็บไซต์เพื่อบันทึกแสตมป์และพอยท์
สำนักงานใหญ่กำหนดสินค้า ราคา และเงื่อนไข ERP ส่วนกลางเผยแพร่เงื่อนไขการสะสม เว็บไซต์อ่านเงื่อนไขนั้นและถือสมุดยอด Loyalty หลักชุดเดียว PetPOS ไม่สร้างรหัสสินค้าและเงื่อนไขเอง
เว็บไซต์รับเฉพาะกุญแจของ ERP ส่วนกลางที่ลงทะเบียนแล้ว กุญแจ POS สาขา อุปกรณ์ หรือ ERP รุ่นเดิมจะไม่ได้รับสิทธิ์ส่วนกลางโดยอัตโนมัติ
เริ่มเชื่อมต่อที่ส่วนกลาง
- SUPER ADMIN เปิด SaaS → โปรไฟล์และการตั้งค่า → เชื่อมต่อ API · ERP/POS
- ลงทะเบียน ERP ส่วนกลาง เลือกสาขาและสิทธิ์ แล้วเก็บ API key ไว้ที่บริการ HQ
- ตั้งกุญแจในระบบจัดการ secret ของ HQ ห้ามตั้งที่ PetPOS หรือเครื่องสาขา
- ERP เรียก GET status แล้วนำเข้าทะเบียนและเผยแพร่เงื่อนไข
/api/integrations/loyalty/v1/ Authorization: Bearer YOUR_ENROLLED_HQ_KEY Content-Type: application/json
หากติดตั้งใต้โฟลเดอร์ย่อย ให้เติมชื่อโฟลเดอร์หน้า /api ตาม URL ในหน้าตั้งค่า ใช้ HTTPS ในระบบจริง
เส้นทางข้อมูล
| ระบบ | หน้าที่ |
|---|---|
| ERP ส่วนกลาง | อนุมัติข้อมูลหลักและเงื่อนไข ตรวจธุรกรรมสาขา เรียก API เว็บไซต์ |
| ERP สาขา / Branch Server | ข้อมูลปฏิบัติการสาขา ตรวจบิล และจัดคิวส่งส่วนกลาง |
| PetPOS | ขายตามข้อมูลที่อนุมัติ สร้างเลขอ้างอิงบิล/เหตุการณ์ตามรูปแบบองค์กร |
| Website Loyalty | กันยอด ตัดยอด คืนยอด และเก็บประวัติในสมุดหลักเดียว |
เงื่อนไขจาก ERP
สร้างหรือแก้ผ่าน POST rules ด้วยกุญแจ HQ ที่มี rules:write หน้าตั้งค่าเว็บไซต์แสดงสถานะและ revision แบบอ่านอย่างเดียว ตัวอย่าง:
{
"externalId": "STAMP-100",
"commandId": "RULE-STAMP-100-V1",
"revision": 0,
"name": "ทุก 100 บาท รับ 1 ดวง",
"active": true,
"currency": "stamps",
"mode": "per_amount",
"basis": "eligibleAmount",
"spendEvery": "100.00",
"reward": 1,
"branches": ["chaengwattana"]
}คำนวณต่อบิล ปัดเศษลง ไม่ยกเศษข้ามบิล ใช้ points และ reward เป็นข้อความทศนิยมเพื่อสะสม PTS ได้ ERP ต้องส่ง revision ที่อนุมัติ หากคำนวณเงื่อนไขซับซ้อนที่ HQ แล้ว ใช้ type grant และสิทธิ์ grants:write
ชำระด้วยแสตมป์หรือ PTS
ใช้สามขั้นตอน กันยอด → ยืนยันตัดยอด หรือปล่อยยอด POST quote เป็นเพียงการตรวจ ไม่ได้กันยอด
1. POST reservations — ส่งธุรกรรมทั้งชุดที่จะยืนยัน:
{
"externalId": "HQ-INTENT-0001",
"expiresInSeconds": 300,
"transaction": {
"externalId": "HQ-INV-0001",
"type": "sale",
"customer": { "externalId": "ERP-C0001" },
"branch": "chaengwattana",
"amount": "550.00",
"eligibleAmount": "500.00",
"cashAmount": "450.00",
"spend": { "stamps": 2, "points": "10.50" },
"rules": [{ "externalId": "STAMP-100", "revision": 1 }]
}
}ตรวจว่า reservation.status เป็น held ก่อนดำเนินการต่อ บันทึก reservationId ใน ERP ยอดจริงยังไม่ถูกหัก แต่ช่องทางอื่นใช้ยอดที่กันไว้ซ้ำไม่ได้ อายุเริ่มต้น 300 วินาที ระบุได้ 30–900 วินาที และไม่เกินวันหมดอายุของกระเป๋าที่ใช้
2. POST reservations/commit — เมื่อพร้อมยืนยันบิล:
{ "reservationId": "hold_ID_FROM_RESERVATION" }ยืนยันตามข้อมูลและเงื่อนไขฉบับที่กันไว้ ไม่รับการเปลี่ยนยอดตอน commit บันทึกสมุดยอด ธุรกรรมอ้างอิง และสถานะกันยอดในธุรกรรมฐานข้อมูลเดียว ส่งซ้ำคืนผลเดิม หากยังไม่ทราบผล ห้ามสร้างบิลหรือเลขกันยอดใหม่เพื่อส่งซ้ำ
3. POST reservations/release — ยกเลิกก่อนยืนยัน:
{
"externalId": "HQ-RELEASE-0001",
"reservationId": "hold_ID_FROM_RESERVATION",
"reason": "ยกเลิกบิลหน้าร้าน"
}รายการหมดอายุคืนยอดพร้อมใช้อัตโนมัติ รายการที่ commit แล้วต้องคืนด้วย refund/void อ้างอิงธุรกรรมเดิม ERP ต้องประสานสถานะเงินจริง บิล และ Loyalty โดยไม่ถือว่าระบบฐานข้อมูลสองแห่ง commit พร้อมกันอัตโนมัติ
รายการรับเข้าและส่งออก
| Method | Endpoint | การใช้งาน |
|---|---|---|
| GET | status | สิทธิ์ HQ สาขา และสถานะบริการ |
| GET / POST | customers | ส่งออก / ผูกรหัสทะเบียน ERP |
| GET | customers/lookup | ยอดรวม ยอดกันไว้ และยอดพร้อมใช้ |
| GET / POST | rules | อ่าน / เผยแพร่เงื่อนไขจาก HQ |
| POST | quote | ตรวจยอดโดยไม่กันยอด |
| GET / POST | reservations | อ่าน / กันยอดก่อนชำระ |
| POST | reservations/commit | ตัดยอดพร้อมยืนยันธุรกรรม |
| POST | reservations/release | ปล่อยยอดก่อนยืนยัน |
| GET / POST | transactions | ส่งออก / ยอดซื้อที่ไม่ใช้ Loyalty การให้ คืนบางส่วน และยกเลิก |
| GET | events / catalog | ส่งออกความเคลื่อนไหว / อ่านของรางวัลและแพ็กเกจ |
การส่งออกใช้ cursor และ snapshot ตามค่าที่ API คืน ไม่ส่ง webhook ออกเอง จำนวนเงินและ PTS เป็นข้อความทศนิยมไม่เกิน 2 ตำแหน่ง แสตมป์เป็นจำนวนเต็มหน่วยดวง
เครื่องมือสำหรับ HQ
ในชุดมี integrations/erp-hq-client.mjs รองรับ status, quote, record, reserve, commit, release, rules และ customer ตั้ง DDSC_HQ_API_URL และ DDSC_HQ_API_KEY ที่เซิร์ฟเวอร์ส่วนกลาง
ตัวส่ง PetPOS ตรงเข้าเว็บไซต์รุ่นเดิมถูกปิดแล้ว ตัวแปลง PetPOS เป็นเพียงเครื่องมือแปลงข้อมูลให้ ERP ตรวจรับ ไม่ใช่สิทธิ์สร้างรหัสสินค้า เงื่อนไข หรือส่งคำสั่งข้าม ERP
ขอบเขตและสถานะ
จำกัด JSON 64 KiB และ 600 คำขอต่อนาทีต่อกุญแจ ใช้ code และ X-Request-Id ตรวจเหตุขัดข้อง ส่งซ้ำด้วยเลขและข้อมูลเดิม เว็บไซต์รุ่นนี้เพิ่มการบังคับ HQ และกันยอดฝั่งเว็บไซต์ พร้อมสัญญาและตัวเรียก API ฝั่ง HQ ต้องนำไปเชื่อมกับบริการ ERP ส่วนกลางจริงตามแผนโครงการก่อนใช้งานร่วมทุกสาขา
หาก ERP ส่วนกลางติดต่อบริการ Loyalty ไม่ได้ PetPOS ต้องไม่อนุมัติใช้ยอดจากสำเนาเก่าเอง การสะสมที่รอส่งต้องผ่านคิวถาวรและตรวจรายการซ้ำที่ ERP ส่วนกลาง
สมาชิกที่อนุมัติแล้ว
GET /api/integrations/loyalty/v1/members?after=0&limit=100 ใช้ HQ key ที่มี members:read อ่าน events ตาม cursor และ snapshot ข้อมูล rows ใช้หัวคอลัมน์เดียวกับ Excel และ Google Sheets จับคู่ด้วย row_key และ member_number ไม่ส่งคำขอที่ยังรอหรือไม่สำเร็จ
ตั้ง Google Sheets ที่ โปรไฟล์และการตั้งค่า → เชื่อมต่อ API · ERP/POS → สมาชิก / Google Sheets อ่านคู่มือ MEMBERSHIP_GUIDE_TH.md ในชุดซอร์ส