บริษัทเจออะไรอยู่
ลูกค้าของเราเป็นบริษัทจัดจำหน่ายที่อนุมัติรายการจ่ายเงินให้ผู้ขายและคู่ค้าใน SAP Business One ทุกวัน ทั้งโอนเข้าบัญชีธนาคารเดียวกัน โอนต่างธนาคาร และโอนไปต่างประเทศ ธนาคารมีบริการโอนเงินเป็นชุดที่รับไฟล์รายการโอนได้ แต่ไฟล์ต้องอยู่ในรูปแบบของธนาคาร เข้ารหัส และส่งให้ทันรอบตัดของธนาคารในแต่ละวัน
ถ้าทำเอง ฝ่ายการเงินต้อง export จาก SAP จัดไฟล์ให้ตรงรูปแบบ แยกตามประเภทการโอน คอยดูวันหยุด อัปโหลด แล้วตามผลว่ารายการไหนผ่าน รายการไหนโดนตีกลับ
เราทำระบบที่ทำงานนี้เองทั้งหมดในวันทำการ ฝ่ายการเงินอนุมัติรายการใน SAP ตามปกติ แล้วดูผลได้จากหน้าจอเดียว
ภาพรวมการทำงาน
flowchart LR
SAP[(SAP Business One)] -->|รายการจ่ายที่อนุมัติแล้ว| A[ระบบจ่ายเงิน]
A --> B[จัดชุดตามประเภทการโอน<br/>บัญชีต้นทาง และวันที่เงินเข้า]
B --> C[สร้างไฟล์ตามรูปแบบธนาคาร<br/>แล้วเข้ารหัส]
C -->|SFTP ตามรอบ| K[ธนาคาร]
K -->|ไฟล์ผลตรวจ / ผลโอน| A
A --> D[ฝ่ายการเงินดูสถานะ<br/>และรายงานการโอน]ระบบไม่เขียนอะไรกลับเข้า SAP ผลการโอนเก็บไว้ในระบบเอง แล้วส่งต่อเป็นรายงาน
หนึ่งวันของระบบจ่ายเงิน
ระบบทำงานตามตารางเวลาเฉพาะวันทำการ และข้ามวันหยุดที่ดึงมาจาก SAP ทุกคืน
sequenceDiagram
participant S as SAP
participant P as ระบบจ่ายเงิน
participant B as ธนาคาร
Note over P: เที่ยงคืน คำนวณวันทำการถัดไป และอัปเดตวันหยุด
S->>P: ดึงรายการจ่ายที่อนุมัติแล้ว
Note over P: จัดชุด สร้างไฟล์ เข้ารหัส
P->>B: อัปโหลดไฟล์ตามรอบ (7 รอบต่อวัน)
B-->>P: ไฟล์ผลตรวจ: ชุดนี้ผ่านหรือไม่ผ่าน
B-->>P: ไฟล์ผลโอน
Note over P: รายการที่ถูกตีกลับ จัดชุดใหม่ ส่งรอบถัดไปรอบอัปโหลดตั้งตามตารางงานของฝ่ายการเงิน รอบดาวน์โหลดเว้นระยะไว้หลังรอบอัปโหลด ให้ธนาคารมีเวลาตรวจไฟล์
รอบเวลาไม่ได้เหมือนกันทุกประเภทการโอน การโอนไปต่างประเทศมีเวลาตัดรอบตอนบ่าย รอบช่วงเย็นจึงส่งเฉพาะการโอนในประเทศ ตารางรอบทั้งหมดอยู่ในที่เดียว ทั้งตัวตั้งเวลาและหน้าจอที่บอกฝ่ายการเงินว่ารอบถัดไปคือกี่โมงอ่านจากตารางเดียวกัน จึงไม่มีทางที่หน้าจอบอกอย่าง แต่ระบบทำอีกอย่าง
รายการเดียวผิด ไม่ให้ทั้งชุดตก
ธนาคารตรวจไฟล์ทั้งไฟล์ ถ้ามีรายการผิดแค่รายการเดียว ทั้งไฟล์ถูกปฏิเสธ รายการอื่นที่ถูกต้องก็โอนไม่ได้ไปด้วย
ระบบจึงตรวจข้อมูลก่อนสร้างไฟล์ รายการที่รู้อยู่แล้วว่าธนาคารจะปฏิเสธ เช่นเลขบัญชีผิดรูปแบบ จะแยกไปอยู่ในชุดของตัวเอง ชุดที่เหลือส่งได้ตามรอบ ส่วนรายการที่ธนาคารตีกลับมา ระบบจัดเข้าชุดใหม่ให้ส่งในรอบถัดไปเอง
บอกได้ว่าทำไมรายการนี้ยังไม่ไป
คำถามที่ฝ่ายการเงินถามบ่อยคือ รายการนี้ทำไมยังไม่ถูกส่ง หน้าจอจึงบอกเหตุผลของทุกรายการที่ค้างอยู่ และบอกว่าต้องแก้ที่ไหน
| เหตุผล | ต้องทำอะไร |
|---|---|
| ยกเลิกใน SAP แล้ว | ไม่ต้องทำอะไร |
| วันที่เงินเข้าเลยมาแล้ว | แก้วันที่ใน SAP |
| ข้อมูลบัญชีผิด | แก้เลขบัญชีใน SAP |
| วันที่เงินเข้ายังไม่ถึงรอบ | ไม่ต้องทำอะไร ระบบส่งเองเมื่อถึงวัน |
รายการที่แค่รอวันส่ง ระบบแสดงเป็นสถานะปกติ ไม่ใช่สีแดงแบบข้อผิดพลาด ฝ่ายการเงินจะได้ไม่ต้องตกใจกับรายการที่ไม่ได้มีปัญหา
ส่งไฟล์ให้ธนาคารอย่างปลอดภัย และไม่ส่งซ้ำ
- เข้ารหัสทุกไฟล์: ไฟล์รายการโอนเข้ารหัสด้วย GPG ด้วยกุญแจสาธารณะของธนาคาร ส่วนไฟล์ผลที่ธนาคารส่งกลับ ระบบถอดรหัสด้วยกุญแจของบริษัท
- ไม่อัปโหลดซ้ำ: ก่อนอัปโหลด ระบบเช็กว่าไฟล์ชื่อเดียวกันและขนาดเท่ากันอยู่บนเซิร์ฟเวอร์ของธนาคารแล้วหรือยัง ถ้าการเชื่อมต่อหลุดกลางทางแล้วระบบลองใหม่ ก็ไม่มีไฟล์ซ้ำขึ้นไปบนเซิร์ฟเวอร์ ซึ่งอาจกลายเป็นการโอนเงินซ้ำ
- รู้ก่อนว่าเชื่อมต่อได้ไหม: ระบบเช็กการเชื่อมต่อไปยังเซิร์ฟเวอร์ของธนาคารทุก 5 นาทีในเวลาทำการ ถ้าเชื่อมต่อไม่ได้ หน้าจอจะขึ้นเตือนก่อนถึงรอบส่ง
ใช้กับระบบของคุณได้ยังไง
ถ้าธนาคารที่ใช้อยู่มีบริการโอนเงินเป็นชุดที่รับไฟล์ได้ และ ERP อ่านรายการจ่ายออกมาได้ ก็ทำแบบเดียวกันได้ ก่อนเริ่มลองตอบคำถามเหล่านี้
- มีการโอนกี่ประเภท และแต่ละประเภทธนาคารตัดรอบกี่โมง
- วันที่เงินเข้ากับวันหยุด ใครเป็นคนกำหนด และเก็บไว้ที่ไหน
- รายการที่ข้อมูลไม่ครบ อยากให้ระบบพักไว้ หรือให้คนตรวจก่อนส่ง
- ผลการโอนต้องกลับไปที่ไหนบ้าง บัญชี รายงาน หรือแจ้งผู้รับเงิน
ผลลัพธ์
เราเริ่มพัฒนาเดือนพฤษภาคม 2568 และระบบเริ่มส่งรายการให้ธนาคารจริงตั้งแต่กลางปีเดียวกัน ฝ่ายการเงินไม่ต้องจัดไฟล์หรืออัปโหลดเอง ระบบส่งวันละ 7 รอบตามตารางงานของฝ่าย และผลการโอนถูกส่งต่อเป็นรายงานรายละเอียดการโอนให้ฝ่ายการเงิน
ระบบเขียนด้วย Laravel 12 ใช้ Livewire กับ Flux ทำหน้าจอ งานตามรอบเวลารันบน Horizon ฐานข้อมูลเป็น MySQL ส่งไฟล์ผ่าน SFTP เข้ารหัสด้วย GPG และอ่าน SAP HANA ผ่าน SQL proxy ที่เราแยกเป็นแพ็กเกจ laravel-sap-proxy






