ขั้นตอนงานรับสินค้าเข้าตรง
หน้านี้อธิบาย flow mobile ปัจจุบันของ รับสินค้าเข้าตรง ใน apps/mobile/src/screens/goodsReceiptStack
ขอบเขต
- Screen entry:
GoodsReceiptList - Detail screen:
goodsReceiptDetailScreen - Submit service:
createGoodsReceiptStockIn(...)
พฤติกรรมปัจจุบัน
- หน้า detail โหลด line items จากเอกสารรับสินค้าเข้าตรงที่เลือก แล้ว normalize แต่ละ line เป็น editable mobile state
- ผู้ใช้กำหนดจำนวนรับจริงผ่านแถว Lot/Batch โดยยอดรับจริงระดับ line เก็บใน
calซึ่งเป็นผลรวม quantity ของ batch ทุกแถวใน line นั้น - แอปรองรับทั้งการรับน้อยกว่าเอกสารและรับเกินเอกสารในแต่ละ line
- แอปไม่ block submit เมื่อจำนวนรับจริงของ line ไม่เท่าจำนวนในเอกสาร
- ตอน submit mobile ส่งทุก line รวมถึง line ที่จำนวนรับจริงเป็น
0 - สำหรับแต่ละ line ที่ส่ง payload ค่า
quantityมาจากจำนวนรับจริงในcalไม่ใช่จำนวนตั้งต้นในเอกสาร - เมื่อเพิ่มสินค้าจาก picker ค่า
warehouseCodeของ line ใหม่จะใช้selectedProduct.whsCodeก่อน แล้วค่อย fallback ไปที่ข้อมูล branch
ขั้นตอนผู้ใช้งาน
กติกาจำนวนสินค้า
line.quantityยังเป็นจำนวนตั้งต้นจากเอกสาร ใช้แสดงให้ผู้ใช้เทียบกับยอดรับจริงline.calคือจำนวนรับจริงที่กรอกจาก Lot/Batch rows- line อาจเป็น:
- รับน้อยกว่าเอกสาร:
cal < quantity - รับเท่ากับเอกสาร:
cal === quantity - รับเกินเอกสาร:
cal > quantity
- รับน้อยกว่าเอกสาร:
- UI อนุญาตค่า
0สำหรับจำนวนระดับ line และ Lot/Batch แต่ไม่อนุญาตค่าว่าง - จำนวนติดลบทั้งระดับ line และ Lot/Batch ถูก block
- batch number ซ้ำใน line เดียวกันยังถูก block
กติกาการ submit
- หน้ายัง block submit เมื่อไม่มี line เลย
- หน้ายัง block submit เมื่อจำนวนของ line ว่างหรือติดลบ
- หน้ายัง block submit เมื่อจำนวนของ Lot/Batch ว่างหรือติดลบ
- หน้าไม่ block submit แล้ว แม้ทุก line มี
cal === 0 - payload lines ที่ส่งไม่ถูก filter ด้วย
cal; ส่งทุก line - quantity ของ payload line map จาก
cal
กติกา warehouse code
เมื่อเพิ่มสินค้าจาก picker, goodsReceiptDetailScreen กำหนด warehouseCode ของ line ใหม่ตามลำดับ fallback นี้:
selectedProduct.whsCodebranch.BranchCodebranch.whsGrpCode- empty string
ทำให้ stock-in payload ใช้ warehouse code ที่ติดมากับ inventory item ที่เลือก เมื่อมีค่านั้นอยู่
การสร้าง Lot/Batch code
เมื่อผู้ใช้เพิ่ม Lot/Batch row ใหม่ใน goodsReceiptDetailScreen, ค่าเริ่มต้นของ batchNumber มาจาก generateBatchCode(...) ใน @bsr/utils
helper กลางตัวเดียวกันถูกใช้ใน transferInDetailScreen สำหรับการสร้าง batch อัตโนมัติของ dummy product และควร reuse ใน POS Terminal เมื่อใช้กฎเดียวกัน
กฎการสร้าง:
- trim
itemCode - ตัด prefix
BT-ด้านหน้าแบบไม่สนตัวพิมพ์เล็ก/ใหญ่ - ถ้า code หลัง normalize สั้นกว่า 4 ตัวอักษร ให้คืนค่าว่าง
- สร้างด้วย
ตัวแรก + YYMMDD + สามตัวท้าย - ถ้า
batchCountมากกว่า0ให้ต่อท้ายด้วย-batchCount
ตัวอย่าง: BT-ABC123 วันที่ 2026-05-21 จะได้ A260521123
ข้อมูลสินค้าจำลองร่วม
product picker สามารถ append dummy products ต่อท้ายรายการสินค้าจริงได้ โดย helper กลางอยู่ที่:
packages/utils/src/dummyProducts.tsและ export เป็นbuildDummyProductsจาก@bsr/utils
ไฟล์ local ของแต่ละแอปอาจมี compatibility re-export ได้ แต่ stock screen ของ Mobile และ POS Terminal ควรเรียกผ่าน boundary กลาง @bsr/utils เพื่อไม่ให้กฎ dummy product drift.
ตอนนี้ใช้โดย:
goodsReceiptDetailScreen
transferWarehouseDetailScreen ไม่ append dummy products แล้ว และใช้เฉพาะ live product inventory เท่านั้น
helper เลือกชุด dummy product ด้วยค่า company:
BFPDBคืนค่า dummy 3 รายการสำหรับ goods receipt- company อื่นคืนค่า NFF dummy product set
BFPDB dummy products
itemCode | itemName |
|---|---|
dummy0001 | DUMMY0001 |
dummy0002 | DUMMY0002 |
dummy0003 | DUMMY0003 |
Non-BFPDB dummy products
itemCode | itemName |
|---|---|
nff-dummy001 | NFF-DUMMY001 |
nff-dummy002 | NFF-DUMMY002 |
nff-dummy003 | NFF-DUMMY003 |
dummy helper เติม field มาตรฐานของ inventory เช่น unit, price เป็น 0, stock เป็น 0, company, branch warehouse code, และ branch warehouse name เพื่อให้ goods receipt picker ได้ product shape แบบเดียวกับรายการสินค้าจริง
เหตุผลที่สำคัญ
- backend ได้จำนวนรับจริงของทุก line รวมถึง
0ทำให้ line ที่ skip หรือรับเป็นศูนย์ถูกส่งใน payload อย่างชัดเจน - ผู้ใช้ปิดงานรับสินค้าได้โดยไม่ถูกบังคับให้รับเท่ากับจำนวนตั้งต้นใน PO
- จำนวนตั้งต้นในเอกสารยังแสดงไว้ให้เทียบ โดยไม่บังคับให้ผู้ใช้ต้องรับตามจำนวนนั้น