Step 1: ข้อมูลสัญญา
Step 1 คือจุดเริ่มต้นของการสร้างสัญญา ระบบใช้ข้อมูลในหน้านี้เป็น “โครงหลัก” เพื่อส่งต่อไปยัง Step 2 และ Step 3 และใช้เป็นฐานข้อมูลให้หน้าดูรายละเอียดสัญญา รวมถึงการคำนวณงานอื่น ๆ ที่อ้างอิงสัญญานี้ภายหลัง

จำนวนสัญญาที่สร้างได้
- จากโค้ดที่ตรวจสอบพบว่า 1 customer สามารถสร้างสัญญาได้หลายรายการ
- ไม่พบการกำหนดเพดานจำนวนสัญญาสูงสุดใน
schema.prisma,contracts.service.ts, หรือหน้าสร้างสัญญาที่ตรวจสอบ - หน้ารายการสัญญาของลูกค้าจึงแสดงแบบแบ่งหน้าเพื่อรองรับหลายรายการ
ใช้ทำอะไร
- สร้างข้อมูลหลักของสัญญา เช่น ชื่อสัญญา ช่วงอายุสัญญา และวันตัดรอบบิล
- ระบุกลุ่มเงื่อนไขของสัญญา เช่น
A1,A2,A3,B1,B2,C,D,E,F - กำหนดว่า สัญญานี้เกี่ยวข้องกับ
ใช้รถร่วมหรือStandbyหรือไม่ - ตั้งค่ารายละเอียดสายรถและรอบเดินรถที่ใช้ในสัญญา
- เตรียมข้อมูลให้ Step 2 ใช้เลือกสูตรวางบิลที่ถูกต้อง
โครงของหน้าจอ
Step 1 แบ่งเป็น 3 ส่วนหลัก:
- ข้อมูลสัญญา
- ชื่อสัญญา
- วันที่เริ่มสัญญา
- วันที่สิ้นสุดสัญญา
- วันที่ตัดรอบบิล
- กลุ่มเงื่อนไข
- กำหนดสายรถ
- ใช้ระบุสายรถที่อยู่ในสัญญา
- ใช้กำหนดระยะทางและรอบเดินรถของแต่ละสาย
- ปุ่มการทำงาน
ยกเลิกบันทึกร่างถัดไป
ข้อมูลที่บังคับต้องกรอก
| ฟิลด์ | จำเป็น | ใช้ทำอะไร |
|---|---|---|
ชื่อสัญญา | ใช่ | ใช้เป็นชื่ออ้างอิงหลักของสัญญา |
วันที่เริ่มสัญญา | ใช่ | กำหนดวันเริ่มมีผลของสัญญา |
วันที่สิ้นสุดสัญญา | ใช่ | กำหนดวันสิ้นสุดการใช้งานของสัญญา |
วันที่ตัดรอบบิล | ใช่ | ใช้กำหนดวันตัดรอบสำหรับการวางบิล |
กลุ่มเงื่อนไข | ใช่ | กำหนดว่าจะใช้ Step 2 และ Step 3 แบบใด |
ประเภทการกำหนด ของ B1/B2 | ใช่เฉพาะ B1/B2 | ต้องเลือก กำหนดตามประเภทรถ หรือ กำหนดตามราคาเหมา |
สายรถ | ใช่ ยกเว้น D | ใช้กำหนดเส้นทางหลักของสัญญา |
ชื่อสายรถ | ใช่ | ต้องไม่ซ้ำกันในสัญญาเดียวกัน |
ระยะทาง | ใช่ | ใช้ประกอบการคำนวณงานที่อิงระยะทาง |
รอบเดินรถ | ใช่ | อย่างน้อย 1 รอบต่อสายรถ |
เวลาเดินรถ | ใช่ | ใช้ระบุเวลาเดินรถของแต่ละรอบ |
In/Out | ใช่ | ระบุประเภทเที่ยวของรอบนั้น |
อธิบายแต่ละช่อง
1) ชื่อสัญญา
- เป็นชื่อสำหรับอ้างอิงสัญญา
- แนะนำให้ตั้งชื่อที่อ่านแล้วรู้ว่าเป็นสัญญาของลูกค้ารายใด
- ช่องนี้บังคับกรอก
2) ระยะเวลาสัญญา
- ต้องกรอกทั้ง
วันที่เริ่มสัญญาและวันที่สิ้นสุดสัญญา - ระบบใช้ข้อมูลนี้เป็นช่วงเวลาการมีผลของสัญญา
- ถ้ากรอกช่วงวันที่ไม่ครบ ระบบจะไม่ให้ผ่านไป Step ถัดไป
3) วันที่ตัดรอบบิล
- ใช้กำหนดวันที่ระบบจะใช้คำนวณการตัดรอบบิล
- เป็นข้อมูลบังคับ
- ต้องเลือกจากรายการวันที่ที่ระบบเตรียมไว้
4) กลุ่มเงื่อนไข
- เป็นตัวกำหนดรูปแบบการคิดเงินและรายละเอียดที่ต้องกรอกใน Step 2
- มีหลายกลุ่ม เช่น
A1,A2,A3,B1,B2,C,D,E,F - ถ้าเลือก
B1หรือB2ระบบจะบังคับให้เลือกประเภทการกำหนดเพิ่ม
5) ประเภทการกำหนดของ B1/B2
- ใช้เฉพาะเมื่อกลุ่มเงื่อนไขเป็น
B1หรือB2 - มี 2 แบบ:
กำหนดตามประเภทรถกำหนดตามราคาเหมา
- ถ้าเลือกกลุ่มอื่น ระบบจะล้างค่านี้ออกอัตโนมัติ
6) ใช้รถร่วม
- เป็น checkbox สำหรับระบุว่าสัญญานี้เกี่ยวข้องกับรถร่วม
- ถ้าเปิดไว้ ระบบจะนำไปใช้ในการแสดงและคำนวณข้อมูลที่เกี่ยวข้องในขั้นตอนถัดไป
7) กำหนดสายรถ
- ใช้ระบุสายรถที่อยู่ในสัญญานี้
- 1 สัญญาสามารถมีหลายสายรถได้
- สายรถแต่ละเส้นจะมีรายละเอียดชื่อสายและระยะทาง
8) รอบเดินรถของแต่ละสาย
- 1 สายรถต้องมีรอบเดินรถอย่างน้อย 1 รอบ
- ในแต่ละรอบต้องระบุ
- เวลาเดินรถ
- ประเภทเที่ยว
InหรือOut - ตัวเลือก
Shift - ตัวเลือก
Office
ShiftและOfficeเป็นตัวเลือกเสริม แต่เวลาเดินรถและประเภทเที่ยวเป็นข้อมูลบังคับ
ฟีเจอร์คัดลอกสายรถ
ฟีเจอร์นี้ช่วยให้สร้างสายรถใหม่ได้เร็วขึ้นเมื่อโครงสร้างใกล้เคียงกับสายรถเดิม
ทำอะไรได้บ้าง
- คัดลอกข้อมูลสายรถเดิมไปสร้างเป็นสายรถใหม่
- คัดลอกชื่อสายรถ, ระยะทาง และรอบเดินรถที่มีอยู่
- ลดเวลาการกรอกซ้ำเมื่อมีหลายสายรถที่รูปแบบคล้ายกัน
วิธีใช้งาน
- กดไอคอนคัดลอกที่อยู่บนการ์ดของสายรถ
- ระบบจะสร้างสายรถใหม่ถัดจากสายรถต้นฉบับ
- ชื่อสายรถใหม่จะถูกตั้งเป็นลำดับอัตโนมัติ เช่น
สายรถที่ 2 - ผู้ใช้งานสามารถแก้ชื่อสายรถ ระยะทาง และรอบเดินรถต่อได้ตามต้องการ
เหตุผลที่ฟีเจอร์นี้สำคัญ
- ลดงานกรอกข้อมูลซ้ำ
- ช่วยให้เพิ่มสายรถได้เร็วขึ้น
- เหมาะกับกรณีที่สัญญาหนึ่งมีหลายสายรถที่มี pattern คล้ายกัน
ข้อบังคับสำคัญของ Step 1
- ถ้าเลือกกลุ่ม
Dระบบจะไม่ใช้รายการสายรถใน Step 1 - ถ้าไม่ใช่กลุ่ม
Dระบบจะบังคับให้มีสายรถอย่างน้อย 1 รายการ - ชื่อสายรถห้ามซ้ำกัน
- เวลาเดินรถภายในสายเดียวกันห้ามซ้ำกัน
- แต่ละสายรถต้องมีรอบเดินรถอย่างน้อย 1 รอบ
B1และB2ต้องเลือกgroupOptionalLogic- ปุ่ม
Nextจะตรวจข้อมูลก่อนข้ามไป Step 2
ลำดับการกรอกที่แนะนำ
- กรอก
ชื่อสัญญา - เลือก
วันที่เริ่มสัญญาและวันที่สิ้นสุดสัญญา - เลือก
วันที่ตัดรอบบิล - เลือก
กลุ่มเงื่อนไข - ถ้าเป็น
B1/B2ให้เลือกประเภทการกำหนด - เปิด/ปิด
ใช้รถร่วมตามการใช้งานจริง - เพิ่มสายรถ
- กรอกชื่อสายรถและระยะทาง
- เพิ่มรอบเดินรถของแต่ละสาย
- ตรวจสอบว่าข้อมูลครบ แล้วกด
บันทึกร่างหรือถัดไป
ปุ่มด้านล่างทำอะไร
ยกเลิก- ออกจากหน้าสร้างสัญญาบันทึกร่าง- เก็บข้อมูลไว้ก่อน ยังไม่สร้างสัญญาจริงถัดไป- ตรวจความครบถ้วน แล้วไป Step 2
การป้องกันข้อมูลหายระหว่างกรอก
ถ้าผู้ใช้แก้ข้อมูลในฟอร์มแล้วพยายามออกจากหน้าโดยยังไม่ได้ บันทึกร่าง หรือ บันทึกสัญญา
ระบบจะขึ้น dialog เตือนก่อนออกจากหน้า ทั้งกรณีกดเปลี่ยน route ในแอปและกรณีปิด/refresh browser
พฤติกรรมนี้มาจาก hook ฝั่ง frontend โดยตรง จึงช่วยลดความเสี่ยงที่ข้อมูลใน Step 1 จะหายระหว่างกรอกหลายส่วนพร้อมกัน
อ้างอิงโค้ดล่าสุด
/Users/chanchaitasujai/Project-ATP30/atp30-tos-frontend/src/views/pages/contracts/steps/Step1ContractInfo.tsx/Users/chanchaitasujai/Project-ATP30/atp30-tos-frontend/src/views/pages/contracts/steps/hooks/useContractRouteValidation.ts/Users/chanchaitasujai/Project-ATP30/atp30-tos-frontend/src/views/pages/contracts/forms/hooks/useUnsavedContractNavigationGuard.ts
ผลของ Step 1 ต่อระบบ
ข้อมูลใน Step 1 จะถูกใช้ต่อใน
- การเลือกฟอร์มใน Step 2
- การคำนวณรายได้และใบวางบิล
- การแสดงข้อมูลในหน้าดูรายละเอียดสัญญา
- การเชื่อมต่อกับข้อมูลเที่ยวรถและงานปฏิบัติการอื่น ๆ
สรุปสั้น ๆ
Step 1 คือการสร้างโครงสัญญาให้พร้อมก่อนจะไปกำหนดสูตรวางบิลใน Step 2 และเงื่อนไขรายได้ใน Step 3 ถ้าข้อมูลใน Step 1 ไม่ครบ ระบบจะไม่อนุญาตให้ไปต่อ