รับสินค้าเข้าตรง
เมนูรับสินค้าเข้าตรงใช้บันทึก stock ที่เข้าคลังสาขาโดยไม่ได้เริ่มจากเอกสารโอนสาขา ผู้ใช้เลือกสินค้าจาก inventory context ของสาขา ระบุจำนวนและ batch แล้วส่ง payload รับเข้าไปที่ API/MST
ทางเข้าในแอป
| App | Target |
|---|---|
| Mobile | GoodsReceiptList -> GoodsReceiptDetail |
| POS Terminal | goodsReceipt -> 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 หลังผู้ใช้ยืนยัน receiptDatedefault เป็นต้นวันปัจจุบัน แต่ผู้ใช้เปลี่ยนได้ก่อนสร้าง/ส่งข้อมูล batch
พจนานุกรมข้อมูลและแหล่งที่มา
ขอบเขตตารางนี้คือ field ที่ Mobile และ POS Terminal อ่านหรือส่งจริงใน flow นี้ ไม่รวม field เพิ่มเติมที่ backend อาจคืนมาในอนาคตผ่าน index signature ของ model. ค่าในรายการเอกสารมาจาก GET /goods-receipt-po?branchId={selectedBranchId}; ก่อนส่ง POST /stock-in ทั้งสองแอป copy ข้อมูลรายการเดิมด้วย ...goodsReceipt แล้วเขียนทับเฉพาะ field ที่ระบุด้านล่าง
Header
| Field | คืออะไร | ได้มาจาก / กติกาก่อนส่ง |
|---|---|---|
company | รหัสบริษัทของเอกสาร | passthrough จาก response goods-receipt-po |
docEntry, docNum | ID ภายในและเลขเอกสาร PO | passthrough จาก response; ใช้แสดงรายการ/รายละเอียด |
docDate, docDueDate, taxDate | วันที่เอกสาร, กำหนดส่ง, วันที่ภาษี | passthrough จาก response |
cardCode, cardName | รหัสและชื่อคู่ค้า | passthrough จาก response |
comments | หมายเหตุระดับเอกสาร | passthrough จาก response |
numAtCard | เลขอ้างอิงคู่ค้า | passthrough จาก response goods-receipt-po ทั้ง Mobile และ Terminal; flow นี้ ไม่สร้างค่าใหม่ |
branchId | ID สาขาของเอกสาร | passthrough จาก response; ใช้ selectedBranchId เป็น query parameter ตอนโหลดรายการ |
branchCode, branchName | warehouse group code/name ของผู้รับเข้า | เขียนทับจาก selected branch: whsGrpCode, whsGrpName; ถ้าไม่มีจึงใช้ค่าจากเอกสารเดิม |
userCode | รหัสผู้บันทึก | เขียนทับจาก user ที่ login; fallback ค่าเดิม |
userName, whsEmpName | ชื่อผู้บันทึก/พนักงานคลัง | สร้างจากชื่อผู้ใช้ปัจจุบัน; fallback name ที่มีใน user context |
payloadBefore | JSON 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 | คลังรับของ line | line เดิมมาจาก API; line ใหม่ใช้ product.whsCode -> branch.BranchCode -> branch.whsGrpCode |
costingCode ถึง costingCode5 | cost center ของ line | passthrough จาก API; line ใหม่เริ่มเป็นค่าว่าง |
poRemarks | หมายเหตุ line จาก PO | passthrough จาก API; ไม่ใช้เป็น field แก้ไขใน payload ใหม่ |
batchNumbers | lot/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 key | goodsReceipt |
| 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
| เรื่อง | Mobile | POS Terminal |
|---|---|---|
| Navigation | stack screen เฉพาะเมนู | detail form ใน HomeScreen แบบ split-pane |
| การเพิ่มสินค้า | picker/modal เต็ม flow | modal ใน detail panel |
| Batch/date validation | ตรวจจำนวน, batch ซ้ำ และวันที่ | ตรวจจำนวน/batch ซ้ำ; deposit date ถูกส่งใน payload |
| หลังบันทึก | กลับหรือ replace ไปหน้ารายการ | refresh list pane แล้วปิด detail |
Developer Handoff Map
| Area | Code |
|---|---|
| Mobile list/detail | apps/mobile/src/screens/goodsReceiptStack/goodsReceiptListScreen, goodsReceiptDetailScreen |
| Terminal detail | apps/pos-terminal/src/screens/HomeScreen/GoodsReceiptDetailForm.tsx |
| Mobile service | apps/mobile/src/services/goodsReceipt.ts |
| Terminal service | apps/pos-terminal/src/services/goodsReceipt.ts / goodsReceipts.ts |
| Shared rules | @bsr/utils batch helpers, utils date/quantity validators |