← โปรเจกต์

ระบบจองและออกบิลสำหรับธุรกิจเช่ารถงานประจำ

2024 · Siam Orchard Group

backend ของธุรกิจเช่ารถและทัวร์ในญี่ปุ่น การจองหนึ่งรายการต่อไปเป็นใบเสนอราคา มัดจำ ใบแจ้งหนี้ การชำระเงิน และใบเสร็จได้เอง พนักงานจึงไม่ต้องพิมพ์เอกสารด้วยมืออีก

100+REST endpoint
50%งานเอกสารที่ทำมือลดลง
7ประเภทเอกสารที่ออกอัตโนมัติ
ทุกวันตรวจการชำระเงินทุกรายการกับ gateway
  • NestJS 11 + Fastify
  • TypeScript
  • MongoDB / Mongoose
  • Zod
  • INET Payment Gateway
  • React-PDF
  • LINE Messaging API
  • Google Sheets
  • Mailchimp
  • Sentry
  • Vercel

สิ่งที่ทำ

  • สร้าง backend ของระบบจองและออกบิลสำหรับธุรกิจเช่ารถ มี REST endpoint มากกว่า 100 ตัว ลดงานเอกสารที่ทำมือลง 50%
  • เชื่อม payment gateway ของ INET (QR และบัตร) ด้วย IP whitelist และรับ callback แบบกันทำซ้ำ พร้อมงาน reconcile ประจำวันที่ตรวจทุกรายการกับ gateway แล้วซ่อมรายการที่ค้างให้อัตโนมัติ
  • ทำให้เอกสารบัญชีทั้งชุดเป็นอัตโนมัติ (ใบเสนอราคา มัดจำ ใบแจ้งหนี้ ใบเสร็จ ใบเพิ่มหนี้/ลดหนี้ voucher) ตั้งแต่สร้าง PDF ส่งอีเมล ออกเลขเอกสาร จนถึงอัปเดตสถานะต่อเนื่องจากการจองไปยังเอกสารที่เกี่ยวข้อง
  • สร้างระบบรวมข้อมูลลูกค้าจากการจองและเอกสารทั้งหมด (จับคู่เบอร์โทร อีเมล เลขผู้เสียภาษี และชื่อที่ normalize แล้ว) จัดอันดับรายชื่อที่น่าจะซ้ำตามความมั่นใจ และ sync ทุกวันแบบรันซ้ำได้ปลอดภัย
  • เชื่อม LINE Messaging, Google Sheets และ Mailchimp เพิ่มการติดตามด้วย Sentry และ audit log ของ API ที่ปิดบังข้อมูลอ่อนไหว
  • ย้าย API จาก route handler ของ Next.js ไปเป็น NestJS 11 บน Fastify และทดสอบครบทั้ง flow: จอง ใบแจ้งหนี้ มัดจำ callback การชำระเงิน ใบเสร็จอัตโนมัติ และอีเมล

ปัญหาที่ต้องแก้

ธุรกิจนี้ให้เช่ารถและขายทัวร์ในญี่ปุ่นให้ลูกค้าคนไทย เดิมรับจองทาง 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 แล้ว

โปรเจกต์อื่น