ใบจัดสินค้าสายส่ง
ใบจัดสินค้าสายส่งเป็นจุดเชื่อมระหว่างใบแจ้งหนี้ที่ออกแล้วกับงานขนส่ง เอกสารนี้ใช้รวม invoice ตามสายส่ง เรียงลำดับลูกค้า/ใบแจ้งหนี้ ตรวจสินค้า เลือก lot/batch ยืนยันการโหลดสินค้า และส่งรายการไป B1 เพื่อตัดสต๊อก
แนวคิดสำคัญคือ invoice ยังอยู่ในเอกสารใบจัด แต่การตรวจสินค้าและการเลือก lot ถูกบันทึกที่ delivery document เมื่อยืนยันใบจัดแล้ว ระบบจะล็อกการเพิ่ม/ลบ/เรียง invoice และงานจะย้ายไป action ของขนส่ง/คลัง
ทางเข้าในแอป
| App | Target |
|---|---|
| Mobile | ShippingList -> ShippingDetail |
| POS Terminal | shippingRoute -> ShippingRouteDetailForm |
State Flow ตั้งแต่ต้นจนจบ
การสร้างใบจัดและจัดการ Invoice
รายละเอียดสำคัญ:
- ต้องเลือกสายส่งก่อนสร้างเอกสาร
- ต้องมี
branchIdและwhGrpCodeถ้าไม่ครบระบบจะ block การสร้าง - invoice ที่เลือกได้ต้องไม่ถูก cancel และยังไม่ถูกผูกกับ delivery อื่น
- เพิ่ม invoice ใช้
addInvoiceToDelivery(...); ลบ invoice ใช้deleteInvoiceFromDelivery(...) - การเรียงลำดับใช้
sortDeliveryInvoices(...) - หลังยืนยันใบจัดแล้ว จะเพิ่ม ลบ หรือเรียง invoice ไม่ได้ เว้นแต่มี flow operational อื่นมาปลดล็อก/จัดการใหม่
- Mobile มี guard ลบเอกสาร active ที่ถูกยืนยันแล้วแต่ไม่มี invoice เหลือ เพื่อไม่ให้ค้างเป็นใบจัดว่าง
การตรวจสินค้า เลือก Lot และส่ง B1
การตรวจสินค้าเริ่มหลังใบจัดถูกยืนยันและถูกนำขึ้นขนส่งแล้ว (toTransportation = 1) ถ้ายังไม่ถูกนำขึ้นขนส่ง action สินค้าจะขึ้นข้อความว่า ยังไม่ถูกจัดขึ้นขนส่ง
พฤติกรรมตอนส่ง B1:
Flow การโหลดสินค้าและลงชื่อร่วมจัด
ความหมายของ loadingStatus:
| ค่า | ความหมาย |
|---|---|
| ว่าง | ยังไม่ยืนยันการโหลดสินค้า |
LOADING_DOCK | จัดสินค้าไว้ที่ลานแล้ว |
LOADED | จัดสินค้าขึ้นรถเรียบร้อย |
สถานะที่ต้องรู้
| Field | Value | ความหมาย |
|---|---|---|
deliveryStatus | ว่าง | กำลังเตรียมใบจัด |
deliveryStatus | FINISHED | ฝ่ายขายจัดใบสั่งขายเสร็จแล้ว |
deliveryStatus | CHECKLOCATION | คลังเช็คสินค้า/lot แล้ว |
deliveryStatus | PENDING_FOR_B1 | กำลังรอ B1 ตัดสต๊อก |
deliveryStatus | SOME_DELIVERY_FAIL | มีอย่างน้อยหนึ่ง invoice ตัดสต๊อกไม่สำเร็จ |
deliveryStatus | DONE | ตัดสต๊อกเรียบร้อย |
status | DELETED | เอกสารถูกลบ/ล็อก |
สิทธิ์และเงื่อนไข
| Action | Guard |
|---|---|
| เห็นเมนู Terminal | shippingRoute, deptCode -2, 1, 2, 3, 4, 7, 29, 21, 8, 9, 12, 22, 27, 28, 13, 16, 14, 30, เฉพาะสาขาหลัก |
| สร้างใบจัด | canCreateShippingRoute(...), ต้องอยู่สาขาหลัก, เลือกสายส่งแล้ว, มี branchId และ whGrpCode |
| เพิ่ม/ลบ/เรียง invoice | เอกสารไม่ถูกลบ, ยังไม่ confirm, user เป็นเจ้าของเอกสาร |
| ลบ invoice row | เงื่อนไขเดียวกับแก้ invoice และ toB1 !== 1 |
| ยืนยันใบจัด | เอกสารไม่ถูกลบ, ยังไม่ confirm, user เป็นเจ้าของเอกสาร |
| รับงาน | confirm แล้ว, toTransportation = 1, ยังไม่มี acceptedBy, dept อยู่ใน ACCEPT_DEPTS |
| ตรวจสินค้า/เลือก lot | dept 2, 8, 22, user 999997, หรือเป็นผู้รับงาน (acceptedBy) |
| ยืนยันจัดที่ลาน / ขึ้นรถ | dept อยู่ใน LOAD_DOCK_DEPTS |
| ลงชื่อร่วมจัดสินค้า | loadingStatus = LOADING_DOCK และ dept อยู่ใน ASSIGN_DEPTS |
| ส่ง B1 | dept 2, 8, 12, 22, 28 และสถานะเป็น CHECKLOCATION, PENDING_FOR_B1, หรือ SOME_DELIVERY_FAIL |
| ขอ cancel invoice | dept 12, 22, 28, delivery ยังไม่ DONE, invoice ไม่มี discount/credit note และยังไม่ส่ง B1 |
Mobile vs POS Terminal
| เรื่อง | Mobile | POS Terminal |
|---|---|---|
| โครงหน้าจอ | ShippingList -> ShippingDetail | shippingRoute -> ShippingRouteDetailForm |
| รายการ | list screen พร้อม status filter | split-pane list card ใน HomeScreen |
| รายละเอียด | detail เต็มหน้า มี bottom/header actions | detail panel ฝั่งขวา ส่ง action ผ่าน onHeaderActionsChange |
| invoice ที่เลือกได้ | getShippingInvoicesWithoutDelivery(...) | getShippingRouteAvailableInvoices(...) ผ่าน split menu data |
| progress ส่ง B1 | modal แสดงสถานะแต่ละ batch | modal แสดงสถานะแต่ละ batch |
| เลือก lot | BatchLotSheet / BatchLotEditorModal | batch picker/editor ใน shipping detail form |
Developer Handoff Map
| Area | Code |
|---|---|
| Mobile list | apps/mobile/src/screens/shippingStack/shippingListScreen/index.tsx |
| Mobile detail | apps/mobile/src/screens/shippingStack/shippingDetailScreen/index.tsx |
| Mobile rules/helpers | apps/mobile/src/screens/shippingStack/shippingDetailScreen/helpers.ts |
| Terminal detail | apps/pos-terminal/src/screens/HomeScreen/ShippingRouteDetailForm.tsx |
| Terminal split services | apps/pos-terminal/src/services/splitMenuData.ts |
| Delivery APIs | apps/mobile/src/services/deliveries.ts, apps/pos-terminal/src/services/deliveries.ts |
| Shipping queries | apps/mobile/src/services/shipping.ts, apps/pos-terminal/src/services/shipping.ts |
| Transport follow-up | apps/*/src/services/transport.ts, TransportDetailForm |