ข้ามไปยังเนื้อหาหลัก

ขั้นตอนงานรับสินค้าเข้าตรง

หน้านี้อธิบาย 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 นี้:

  1. selectedProduct.whsCode
  2. branch.BranchCode
  3. branch.whsGrpCode
  4. 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 เมื่อใช้กฎเดียวกัน

กฎการสร้าง:

  1. trim itemCode
  2. ตัด prefix BT- ด้านหน้าแบบไม่สนตัวพิมพ์เล็ก/ใหญ่
  3. ถ้า code หลัง normalize สั้นกว่า 4 ตัวอักษร ให้คืนค่าว่าง
  4. สร้างด้วย ตัวแรก + YYMMDD + สามตัวท้าย
  5. ถ้า 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

itemCodeitemName
dummy0001DUMMY0001
dummy0002DUMMY0002
dummy0003DUMMY0003

Non-BFPDB dummy products

itemCodeitemName
nff-dummy001NFF-DUMMY001
nff-dummy002NFF-DUMMY002
nff-dummy003NFF-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
  • จำนวนตั้งต้นในเอกสารยังแสดงไว้ให้เทียบ โดยไม่บังคับให้ผู้ใช้ต้องรับตามจำนวนนั้น