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

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

เมนูรับสินค้าเข้าตรงใช้บันทึก stock ที่เข้าคลังสาขาโดยไม่ได้เริ่มจากเอกสารโอนสาขา ผู้ใช้เลือกสินค้าจาก inventory context ของสาขา ระบุจำนวนและ batch แล้วส่ง payload รับเข้าไปที่ API/MST

ทางเข้าในแอป

AppTarget
MobileGoodsReceiptList -> GoodsReceiptDetail
POS TerminalgoodsReceipt -> GoodsReceiptDetailForm

Workflow ตั้งแต่ต้นจนจบ

เงื่อนไขสำคัญของระบบ

เงื่อนไขรายละเอียด
ที่มาของเลข batchต้องกรอก Container No. หรือทะเบียนรถก่อนเพิ่มสินค้า ระบบใช้เลขท้าย 4 หลักเป็น suffix ของ batch
Prefix ของ batchมาจาก generateBatchCode(getSelectedWhsGrpCode(branch), receiptDate) ดังนั้นสาขาและวันที่รับเข้ามีผลกับเลข batch
แหล่งสินค้าสินค้ามาจาก inventory context ของสาขารวมกับ dummy products และกรองตามบริษัทที่เข้ากันได้
จำนวนตอนเพิ่มสินค้าจำนวนสินค้าที่เลือกต้องมากกว่า 0
จำนวนใน line รับเข้าตอน submit บล็อกจำนวนว่างและจำนวนติดลบ ส่วน 0 ทำได้เฉพาะผ่าน flow zero-batch ที่ผู้ใช้ยืนยัน
Batch ที่ต้องมีตอน submit บล็อก line ที่ไม่มี batch, batch number ว่าง, quantity batch ว่าง, quantity batch ติดลบ หรือ batch number ซ้ำ
กรณี batch รวมเป็น 0ถ้า line มี batch แต่ cal === 0 ระบบให้ยืนยันก่อน แล้ว payload จะส่งจำนวนเดิมของ line โดยไม่ส่งจำนวน batch ที่ใช้งานได้สำหรับ line นั้น
ห้องฝาก/non-mainกรณีคลังฝากใช้ due date แบบห้องฝาก ฝั่ง Mobile ตรวจ expiry/due date ก่อน submit ส่วน Terminal form ปัจจุบันส่ง deposit date ไปกับ payload และเน้น guard จำนวน/batch
จำนวน batch เกินจำนวนรายการสินค้าปกติจะแยกส่วนเกินเป็น line ใหม่ lineNum: -1; สินค้า BT- ใช้ยอด batch รวมเป็นจำนวนของ line ได้โดยตรง

โครงสร้าง Payload

หมายเหตุสำหรับ developer:

  • ส่งวันที่รับเข้าด้วย admissionDate เท่านั้น ไม่ส่งคีย์เดิม addmisionDate
  • ส่ง dueDate เฉพาะกรณีคลังฝาก/non-main; ทั้ง admissionDate และ dueDate ใช้รูปแบบ YYYY-MM-DDTHH:mm:ss
  • ถ้า line มี batch แต่ cal === 0 จะส่ง line เดิมโดยไม่ส่ง batch หลังผู้ใช้ยืนยัน
  • receiptDate default เป็นต้นวันปัจจุบัน แต่ผู้ใช้เปลี่ยนได้ก่อนสร้าง/ส่งข้อมูล batch

พจนานุกรมข้อมูลและแหล่งที่มา

ขอบเขตตารางนี้คือ field ที่ Mobile และ POS Terminal อ่านหรือส่งจริงใน flow นี้ ไม่รวม field เพิ่มเติมที่ backend อาจคืนมาในอนาคตผ่าน index signature ของ model. ค่าในรายการเอกสารมาจาก GET /goods-receipt-po?branchId={selectedBranchId}; ก่อนส่ง POST /stock-in ทั้งสองแอป copy ข้อมูลรายการเดิมด้วย ...goodsReceipt แล้วเขียนทับเฉพาะ field ที่ระบุด้านล่าง

Fieldคืออะไรได้มาจาก / กติกาก่อนส่ง
companyรหัสบริษัทของเอกสารpassthrough จาก response goods-receipt-po
docEntry, docNumID ภายในและเลขเอกสาร POpassthrough จาก response; ใช้แสดงรายการ/รายละเอียด
docDate, docDueDate, taxDateวันที่เอกสาร, กำหนดส่ง, วันที่ภาษีpassthrough จาก response
cardCode, cardNameรหัสและชื่อคู่ค้าpassthrough จาก response
commentsหมายเหตุระดับเอกสารpassthrough จาก response
numAtCardเลขอ้างอิงคู่ค้าpassthrough จาก response goods-receipt-po ทั้ง Mobile และ Terminal; flow นี้ ไม่สร้างค่าใหม่
branchIdID สาขาของเอกสารpassthrough จาก response; ใช้ selectedBranchId เป็น query parameter ตอนโหลดรายการ
branchCode, branchNamewarehouse group code/name ของผู้รับเข้าเขียนทับจาก selected branch: whsGrpCode, whsGrpName; ถ้าไม่มีจึงใช้ค่าจากเอกสารเดิม
userCodeรหัสผู้บันทึกเขียนทับจาก user ที่ login; fallback ค่าเดิม
userName, whsEmpNameชื่อผู้บันทึก/พนักงานคลังสร้างจากชื่อผู้ใช้ปัจจุบัน; fallback name ที่มีใน user context
payloadBeforeJSON snapshot ของเอกสารก่อนผู้ใช้แก้สร้างใน detail screen จาก JSON.stringify(goodsReceipt) เพื่อ trace/audit

Line (lines[])

Fieldคืออะไรได้มาจาก / กติกาก่อนส่ง
lineNumลำดับ line ในเอกสารline เดิมมาจาก API; line ที่ผู้ใช้เพิ่มใช้ -1; ทุก line ถูกเรียงตามค่านี้ก่อนส่ง
itemCode, itemDescriptionรหัสและชื่อสินค้าline เดิมมาจาก API; line ใหม่มาจาก product inventory/dummy product ที่ผู้ใช้เลือก
quantityจำนวนที่รับเข้าแปลงเป็น number; ปกติใช้ยอดรวม batch (cal), แต่กรณี batch ว่าง/รวมเป็น 0 ใช้จำนวนตั้งต้นของ line
weightน้ำหนักสินค้าline เดิมหรือ product ที่เลือก แล้วแปลงเป็น number
uomCode, uomEntryหน่วยและ ID หน่วยline เดิมหรือ salUomCode/salUomEntry ของ product ที่เลือก
warehouseCodeคลังรับของ lineline เดิมมาจาก API; line ใหม่ใช้ product.whsCode -> branch.BranchCode -> branch.whsGrpCode
costingCode ถึง costingCode5cost center ของ linepassthrough จาก API; line ใหม่เริ่มเป็นค่าว่าง
poRemarksหมายเหตุ line จาก POpassthrough จาก API; ไม่ใช้เป็น field แก้ไขใน payload ใหม่
batchNumberslot/batch ที่รับใน lineมาจาก batch editor; ดูตาราง batch

Batch (lines[].batchNumbers[])

Fieldคืออะไรได้มาจาก / กติกาก่อนส่ง
batchNumberเลข lot/batchผู้ใช้เลือก/กรอก; batch ใหม่ใช้ prefix จาก warehouse group + วันที่ และ suffix 4 ตัวจาก container/ทะเบียนรถ
quantityจำนวนใน batchผู้ใช้กรอก แล้วแปลงเป็น number
admissionDateวันที่รับเข้าใช้ receiptDate ที่ผู้ใช้เลือก และส่งเป็น YYYY-MM-DDTHH:mm:ss
manufacturingDate, expiryDateวันที่ผลิตและหมดอายุผู้ใช้เลือกใน batch editor หรือค่าที่มีอยู่เดิม
dueDateวันครบกำหนดห้องฝากส่งเฉพาะคลังฝาก/non-main จาก deposit due date ที่ผู้ใช้เลือก เป็น YYYY-MM-DDTHH:mm:ss

สิทธิ์และ guard

เรื่องรายละเอียด
Terminal menu keygoodsReceipt
deptCode ที่เห็นเมนู-2, 1, 2, 3, 4, 7, 29, 21, 8, 9, 12, 22, 27, 28
เงื่อนไขสาขาallowNonMainBranch = true; ถ้าเลือกคลังสาขา non-main เมนูเปิดได้แม้ deptCode ไม่อยู่ในชุด stock menu
Full non-main accessผู้ใช้ที่มีสิทธิ์ full access ของ non-main warehouse ผ่าน menu access ของกลุ่ม stock นี้ได้
local state ที่ต้องมีต้องโหลด selected branch และ user จาก local storage ก่อน submit

Mobile vs POS Terminal

เรื่องMobilePOS Terminal
Navigationstack screen เฉพาะเมนูdetail form ใน HomeScreen แบบ split-pane
การเพิ่มสินค้าpicker/modal เต็ม flowmodal ใน detail panel
Batch/date validationตรวจจำนวน, batch ซ้ำ และวันที่ตรวจจำนวน/batch ซ้ำ; deposit date ถูกส่งใน payload
หลังบันทึกกลับหรือ replace ไปหน้ารายการrefresh list pane แล้วปิด detail

Developer Handoff Map

AreaCode
Mobile list/detailapps/mobile/src/screens/goodsReceiptStack/goodsReceiptListScreen, goodsReceiptDetailScreen
Terminal detailapps/pos-terminal/src/screens/HomeScreen/GoodsReceiptDetailForm.tsx
Mobile serviceapps/mobile/src/services/goodsReceipt.ts
Terminal serviceapps/pos-terminal/src/services/goodsReceipt.ts / goodsReceipts.ts
Shared rules@bsr/utils batch helpers, utils date/quantity validators

เอกสารที่เกี่ยวข้อง