ใบแจ้งหนี้
เมนู ใบแจ้งหนี้ ใช้ติดตาม invoice ที่สร้างจาก flow ใบสั่งขาย, ตรวจรายละเอียดสินค้า/ลูกค้า/สถานะ, ส่งข้อมูลเข้า B1, จัดการคำขอยกเลิก, เปิดใบสั่งขายจาก invoice เดิม และดูสรุปยอดขายราย user/รายสาขาของวันปัจจุบัน
ในระบบนี้ invoice ไม่ใช่จุดเริ่มสร้างยอดขายหลัก จุดเริ่มหลักยังอยู่ที่ ใบสั่งขาย แล้วจึงสร้าง invoice และชำระเงิน จากนั้นหน้าใบแจ้งหนี้จะเป็นหน้าตรวจสอบและปิดงานต่อ
ดู workflow หลักดูปุ่มสรุปยอดขายดูสิทธิ์
ทางเข้าในแอป
| แอป | ทางเข้า | ไฟล์/จุดทำงานหลัก |
|---|---|---|
| Mobile | Home -> InvoiceList -> InvoiceDetail | invoiceListScreen, invoiceDetailScreen |
| POS Terminal | เมนู invoice ใน split home | HomeScreen/index.tsx, ListPane.tsx, InvoicePanels.tsx |
ทั้งสองฝั่งใช้ service boundary เดียวกัน:
| งาน | Endpoint / service |
|---|---|
| โหลดรายการ invoice | GET /invoices ผ่าน getInvoices(...) |
| โหลดรายการรอส่ง B1 | GET /invoices?toB1=0 ผ่าน getInvoicesPendingB1(...) |
| โหลดรายละเอียด | GET /invoices/{invoiceId}?includeLot=true |
| ส่งเข้า B1 | POST /payment/to-b1 payload เป็น array ของ invoiceId |
| retry ส่ง payment/incoming | POST /payment/{invoiceId}/retry |
| สรุปยอดขาย | GET /invoices/summary |
| อนุมัติคำขอยกเลิก | POST /invoices/{invoiceId}/approve |
| ไม่อนุมัติคำขอยกเลิก | POST /invoices/{invoiceId}/reject |
| ขอ cancel invoice | POST /invoices/{invoiceId}/cancel |
Workflow หลัก
รายการใบแจ้งหนี้
รายการหลักโหลดด้วย getInvoices(...) โดยส่ง context ของสาขาที่เลือก:
branchIdจาก selected branchwhGrpCodeจาก selected warehouse grouppage,pageLimit,search- filter พื้นฐาน:
shippingType,invoiceStatus,toB1,inStock,withOutCN,dateFrom,dateTo - sort เป็น
DESCตามinvoiceId
พฤติกรรมของรายการ:
- search ใช้ค้นหาเลขใบแจ้งหนี้, ลูกค้า, หรือใบสั่งขาย
- มีแท็บ
ทั้งหมดและรอส่ง B1 - รายการถูก dedupe ด้วย
invoiceIdหรือinvoiceStorageId - กดรายการใน mode ปกติจะเปิดรายละเอียด invoice
- ใน manual payment mode การกดรายการจะเป็นการเลือก/ยกเลิกเลือก invoice เพื่อส่งข้อมูล
รายละเอียดใบแจ้งหนี้
หน้า detail โหลด GET /invoices/{invoiceId}?includeLot=true แล้วแสดง:
- เลขใบแจ้งหนี้, ลูกค้า, เลขใบสั่งขาย, ผู้เปิดใบ, วันที่ invoice
- summary ของ invoice ผ่าน
InvoiceSummarySection - รายการสินค้าและจำนวนสินค้า
- shipping invoices ที่ผูกกับ order พร้อมปุ่ม retry ส่งข้อมูลขนส่งหรือ incoming ถ้ามีสถานะที่ retry ได้
- ปุ่ม
เปิดใบสั่งขายจากใบแจ้งหนี้เมื่อ user มีสิทธิ์สร้างใบสั่งขาย
การเปิดใบสั่งขายจาก invoice จะส่งค่าเข้า order detail:
{
duplicateInvoiceId,
duplicateInvoiceNo,
duplicateDocumentMove,
duplicateVehicleRelease,
}
ถ้าเป็นสาขาหลัก ระบบเปิด order draft ได้เลย ถ้าไม่ใช่สาขาหลัก จะมี modal ให้เลือก vehicleRelease และ documentMove ก่อนเปิด order
ส่งข้อมูลเข้า B1
การส่ง B1 ทำได้จาก swipe/action รายใบ หรือเลือกหลายใบในโหมดปรับสถานะการชำระเงิน แล้วเรียก POST /payment/to-b1
ก่อนส่งจะตรวจ:
| เงื่อนไข | รายละเอียด |
|---|---|
มี invoiceId | ใช้ invoiceId หรือ fallback invoiceStorageId |
มี refKey | ถ้าไม่มีจะไม่ส่ง |
toB1 = 0 | ถ้าส่งแล้ว action จะแสดงเป็น disabled |
orderStatus = CONFIRMED | ถ้า order ยังไม่ถูกชำระ จะขึ้นข้อความว่าใบสั่งขายยังไม่ได้ถูกชำระ |
| ไม่ติดคำขอยกเลิก | ถ้ามี canceledNote และยังไม่ถูก reject จะ block |
| วัน invoice | user ทั่วไปส่งได้เฉพาะวันนี้/เมื่อวาน; dept 3 ยกเว้น date guard |
ปุ่มสรุปยอดขาย
ปุ่ม สรุปยอดขาย อยู่ในเมนู header ของหน้าใบแจ้งหนี้:
| แอป | ตำแหน่งปุ่ม |
|---|---|
| Mobile | menu item ใน CustomerManagementListHeader ชื่อ สรุปยอดขาย |
| POS Terminal | icon bar-chart-2 ข้างหัวเมนู ใบแจ้งหนี้ ใน ListPane |
เมื่อกดปุ่ม ระบบเรียก /invoices/summary สองครั้งในช่วงวันปัจจุบัน:
ข้อมูลใน modal แยกบริษัท BFP และ NFF และมี block รวม:
| ค่า | วิธีคิด |
|---|---|
| จำนวน invoice | invCount |
| ยอดขาย | amountTotal |
| ส่วนลดคะแนน/คูปอง | discount |
| ส่วนลดเครดิต | useCreditNote |
| คงเหลือ | amountTotal - discount - useCreditNote |
| น้ำหนักรวม | weightTotal |
โหมดปรับสถานะการชำระเงินด้วยตนเอง
โหมดนี้เปิดจากเมนูเดียวกับสรุปยอดขาย:
- Mobile ใช้ label
ปรับสถานะการชำระเงินด้วยตนเอง - Terminal ใช้ icon
check-square; เมื่อเปิดแล้ว icon เปลี่ยนเป็นxเพื่อยกเลิกโหมด - ระบบเปลี่ยนไปโหลดแท็บ
รอส่ง B1 - user ทั่วไปจะถูกจำกัดช่วงวันที่เป็นวันนี้และเมื่อวาน และส่ง
userCodeของตัวเอง - dept
3เห็นทุก user และไม่ใช้ date guard ใน manual mode - เลือกหลาย invoice แล้วกด
ส่งข้อมูล - รายการที่เลือกต้องไม่ถูก cancel, ต้องมี
refKey, และ order ต้องCONFIRMED
คำขอยกเลิกใบแจ้งหนี้
เมนูนี้ไม่ได้เป็นจุดเริ่ม request cancel หลักทุกกรณี แต่เป็นจุดจัดการคำขอที่ invoice มี canceledNote
การจัดการคำขอยกเลิก:
- แสดง action เฉพาะ invoice ที่มี
canceledNoteและยังไม่ถูกrejectCanceledAt - invoice ที่
invoiceStatus = CANCELEDทำรายการซ้ำไม่ได้ - เมื่ออนุมัติเรียก
approveCancelInvoice(invoiceId) - เมื่อไม่อนุมัติเรียก
rejectCancelInvoice(invoiceId) - หลังทำรายการ refresh รายการ invoice ปัจจุบัน
สิทธิ์และเงื่อนไข
| ส่วน | เงื่อนไข |
|---|---|
| เห็นเมนูใบแจ้งหนี้ | MENU_INVOICE.has(deptCode) หรือ admin/full non-main warehouse access |
| dept ที่เห็นเมนู | -2, 1, 2, 3, 4, 7, 8, 9, 13, 16, 20, 21, 22, 23, 27, 29 |
| ส่ง B1 รายใบ | เจ้าของ invoice, dept 3, หรือ override user 012265, 999999 |
| ส่ง B1 เกินช่วงวันนี้/เมื่อวาน | เฉพาะ dept 3 |
| จัดการคำขอยกเลิก | เจ้าของ invoice หรือ override user 012265, 999999 |
| เปิดใบสั่งขายจาก invoice | ต้องผ่าน canCreateSalesOrder |
canCreateSalesOrder หลัก | admin, full non-main warehouse access, หรือ dept -2, 1, 2, 4, 7, 8, 9, 13, 16, 21, 29 |
ข้อควรระวัง: การ “เห็นเมนู” กับการ “ทำ action” ไม่ใช่สิทธิ์ชุดเดียวกัน เช่น dept 20 เห็นเมนูใบแจ้งหนี้และบาง shortcut ใน Home ได้ แต่ action เปิดใบสั่งขายจากใบแจ้งหนี้ยังต้องผ่าน canCreateSalesOrder ของหน้ารายละเอียด
ความต่าง Mobile และ POS Terminal
| เรื่อง | Mobile | POS Terminal |
|---|---|---|
| รูปแบบ UI | stack screen: list -> detail | split pane: menu, list, detail |
| ปุ่มสรุปยอดขาย | header menu item | icon ข้างหัวเมนู invoice |
| รายละเอียด invoice | InvoiceDetailScreen | InvoicePanels ใน panel detail |
| manual payment mode | rail ล่างมี ยกเลิก / ส่งข้อมูล | header action + action ใน list pane |
| duplicate order | navigate ไป OrderDetail | สร้าง/open order detail ใน split panel พร้อม progress |
| summary modal | InvoiceSummaryModal component | InvoiceSummaryModal ใน InvoicePanels.tsx |
Developer Handoff Map
| งาน | Mobile | POS Terminal |
|---|---|---|
| รายการ invoice | apps/mobile/src/screens/invoiceStack/invoiceListScreen/index.tsx | apps/pos-terminal/src/screens/HomeScreen/index.tsx, ListPane.tsx |
| รายละเอียด invoice | apps/mobile/src/screens/invoiceStack/invoiceDetailScreen/index.tsx | apps/pos-terminal/src/screens/HomeScreen/InvoicePanels.tsx |
| service invoice | apps/mobile/src/services/invoices.ts | apps/pos-terminal/src/services/invoices.ts, splitMenuData.ts |
| summary modal | apps/mobile/src/components/InvoiceSummaryModal/index.tsx | InvoicePanels.tsx |
| สิทธิ์ Home menu | apps/mobile/src/screens/homeScreen/index.tsx | apps/pos-terminal/src/screens/HomeScreen/config.ts |
| สิทธิ์เปิด order จาก invoice | apps/mobile/src/utils/salesOrders.ts | canCreateSalesOrder(...) ใน Terminal config |