ปัญหาที่ต้องแก้
ธุรกิจนี้ให้เช่ารถและขายทัวร์ในญี่ปุ่นให้ลูกค้าคนไทย เดิมรับจองทาง LINE อีเมล และโทรศัพท์ แล้วจดลงสเปรดชีต พนักงานคิดราคาเอง พิมพ์ใบแจ้งหนี้และใบเสร็จด้วยมือ และไล่เช็กการชำระเงินทีละรายการ การจองหลุดบ้าง และลูกค้าต้องโทรมาทวงเอกสาร
จากการจองถึงเอกสาร
flow เดียวตั้งแต่จองจนได้เอกสาร ลูกค้าจองผ่านเว็บ พนักงานยืนยันในระบบหลังบ้าน ระบบสร้างใบเสนอราคา ใบขอมัดจำ หรือใบแจ้งหนี้จากการจอง ลูกค้าจ่ายด้วย QR หรือบัตรผ่าน INET แล้ว callback จาก gateway จะบันทึกการชำระ ออกใบเสร็จและ voucher เป็น PDF และส่งอีเมลให้ เมื่อสถานะการจองเปลี่ยน เอกสารทุกใบที่ผูกกับการจองนั้นก็เปลี่ยนตาม
ผมเก็บความต้องการกับทีมธุรกิจและผู้ให้บริการชำระเงิน เขียน spec แล้วสร้างและ deploy API เอง ทั้งระบบหลังบ้านและเว็บฝั่งลูกค้าเรียกใช้ API นี้
โครงสร้างระบบ
- MongoDB กับ Mongoose เอกสารแต่ละใบเก็บข้อมูล ณ วันที่ออกไว้ในตัวเอง เพราะเอกสารการเงินต้องคงเดิมตามที่พิมพ์ออกไป
- การชำระเงิน route ที่รับ callback ยอมรับเฉพาะ IP ของ gateway และถ้า callback ซ้ำก็ไม่ออกใบเสร็จใบที่สอง ส่วน callback ที่ไม่มาถึงเลย งาน reconcile จะเก็บตก
- ข้อมูลลูกค้า รวมข้อมูลจากการจองและเอกสารทุกประเภท จับคู่ด้วยเบอร์ อีเมล เลขผู้เสียภาษี และชื่อที่ normalize แล้ว เป็นโปรไฟล์เดียวพร้อมประวัติการใช้บริการ
- การดูแลระบบ ใช้ Sentry จับ error เก็บ audit log ของการเรียก API โดยปิดบังข้อมูลอ่อนไหว และมีการตรวจบอทที่ฟอร์มจองสาธารณะ
API เริ่มจาก route handler ของ Next.js และตอนนี้ผมย้ายไปเป็น NestJS 11 บน Fastify แล้ว