สินค้า/วัตถุดิบคงเหลือยกมา (เมนู 2033)
จอบันทึกยอดสินค้าคงเหลือตั้งต้น (ic_trans ที่ trans_flag = 54) เป็นจอเฉพาะที่ ไม่ผ่าน UniversalTransScreen เขียนแยกเป็นไฟล์เดียวใหญ่ (~4,000 บรรทัด) มีตารางสินค้า แท็บเพิ่มเติม และแท็บ GL ในตัว กลไกเอกสารฝั่งธุรกิจดู สินค้า/วัตถุดิบ คงเหลือยกมา (Stock Beginning Balance) ส่วนจอ transaction ทั่วไปดู จอบันทึกเอกสารธุรกรรม มุมมองผู้ใช้ (UniversalTransScreen) และ จอเอกสารธุรกรรมแบบเดียวกันทุกจอ (UniversalTransScreen)
วิธีเปิด
เมนู IC (สินค้าคงคลัง) รหัส 2033 menu_ic_stk_balance "สินค้า/วัตถุดิบ คงเหลือยกมา" ลงทะเบียนเป็น BASE_SCREENS ตรง ๆ (screenRegistry.tsx:806) โค้ดจึงไม่มีทางผ่าน TRANS_MENU_MAP กลไกเมนูดู ทะเบียนหน้าจอและโครงเมนู (Screen registry & smlMenu) ภายในจอ getMenuCodeByName("menu_ic_stk_balance", "2.11") ใช้รหัสเก่า "2.11" เป็นค่า fallback (:129)
โครงจอ
- ซ้าย: รายการเอกสาร คอลัมน์ วันที่เอกสาร, เลขที่เอกสาร, เอกสารอ้างอิง, รวมมูลค่าสินค้า (
:441-466) ค้นด้วยเลขที่เอกสาร / เอกสารอ้างอิง / หมายเหตุ (buildSmlSearchWhere) เรียงวันที่ใหม่สุดก่อน (:759-780) - ขวาบน: หัวเอกสาร ช่อง เอกสารเลขที่ *, รหัสเอกสาร (รูปแบบเอกสารจาก
erp_doc_format), เอกสารอ้างอิงวันที่, เอกสารอ้างอิง, คลัง, พื้นที่เก็บ, หมายเหตุ และช่องอ่านอย่างเดียว มูลค่าสุทธิ (ผลรวมช่อง "รวมมูลค่า" ของทุกแถว:361-363) - ขวากลาง: 3 แท็บ "รายละเอียด" (ตารางสินค้า), "เพิ่มเติม", "GL" (
:2268-2290) - แถบเครื่องมือ: บันทึก · ปิดหน้าจอ / ยกเลิกการแก้ไข (Esc) · แก้ไข · เพิ่มใหม่ · ลบ และปุ่ม "ปิดหน้าจอ" ปิดแท็บเมื่อเปิดผ่าน tab workspace (พื้นที่ทำงานแบบแท็บ MDI และสิทธิ์จอ (TabWorkspace)) (
:1964-2045) ปุ่ม "ปิดหน้าจอ" ที่สองแสดงเฉพาะเมื่อมีonClose(:2037) ปุ่มเพิ่ม/แก้ไข/ลบ/บันทึกผูกกับสิทธิ์เมนู (canAdd/canEdit/canDeleteผ่าน การตรวจสิทธิ์เมนูของ route process (Process route rights))
เริ่มเอกสารใหม่ (ปุ่ม "เพิ่มใหม่") — ค่าตั้งต้น
(startNew :901-1030)
- วันที่/เวลา = วันนี้/เวลาปัจจุบัน (HH:MM), สาขา =
00000"สำนักงานใหญ่" - รหัสเอกสาร: ดึง
erp_doc_formatที่screen_code = 'IB'ตัวที่codeมากสุด; ถ้าไม่มี fallback เป็นRMB"สินค้า/วัตถุดิบ คงเหลือยกมา (สำนักงานใหญ่)" - คลัง / พื้นที่เก็บ: เอาคลังแรก (
order by code limit 1จากic_warehouse) และที่เก็บแรกของคลังนั้น (ic_shelf) - เลขที่เอกสาร:
generateSmlDocNo(format +ic_trans+ flag 54 + screenIB) — กลไกเลขดู สถานะต่อเนื่องของเอกสาร กราฟโยงเอกสาร และเลขที่เอกสารถัดไป (Doc flow & numbering) - สมุดรายวัน GL =
01"สมุดรายวันทั่วไป" (หรือgl_bookของ format), ประเภทรายวัน "รายวัน", คำอธิบาย "สินค้ายกมา" - แถวสินค้าว่าง 1 แถว (qty = 1, price = 0)
ตารางสินค้า (แท็บรายละเอียด)
คอลัมน์ รหัสสินค้า * · ชื่อสินค้า · บาร์โค้ด (สลับแสดง/ซ่อนได้ด้วยปุ่มขวาของแถบแท็บ) · คลัง · พื้นที่เก็บ · หน่วยนับ (+ หน่วยนับขนานเมื่อสินค้ามี unit_type 2 หรือ 3) · จำนวน · ต้นทุน (ช่อง price) · รวมมูลค่า · จัดการ (ลบแถว) (:2327-2700) จอนี้วาดตาราง HTML (<table>) ของตัวเอง ไม่ใช้ TransItemGrid ของจอ transaction ทั่วไป (ตารางรายการสินค้า/จำนวนเงินในเอกสาร (TransItemGrid), ตารางรายการและหน้าต่างค้นหา (SmlDataList, SmlLookupModal, SmlLookupInput))
เมื่อเลือกสินค้า (handleItemSelect :1286-1350):
- หน่วยนับ =
unit_standardของสินค้า, ดึงstand_value/divide_value/ratioจากic_unit_use - ต้นทุน =
cost/average_costของสินค้า แต่ถ้าผู้ใช้พิมพ์ต้นทุนในแถวไว้แล้วก่อนเลือกสินค้า ค่าที่พิมพ์ชนะ (priceAfterLookup:114-116) - คลัง/พื้นที่เก็บ ใช้ของหัวเอกสารถ้าแถวยังว่าง
- รวมมูลค่า =
qty x priceปัดทศนิยม 2 ตำแหน่งด้วยmulDec(:1199-1215)
ปุ่ม / คีย์ลัด
คีย์ลัดผูกกับ window.keydown ทำงานเฉพาะเมื่อแท็บของจอนี้ active (tabActive, :1729-1731)
| คีย์ | ทำอะไร |
|---|---|
| Esc | ปิด modal/เมนูคลิกขวา/dialog ที่เปิดอยู่ก่อน → ถ้ากำลังแก้ไขให้ยกเลิกการแก้ไข → ไม่งั้นปิดแท็บ |
| Ctrl+S | บันทึก (เฉพาะขณะแก้ไข) |
| Ctrl/Alt+1 | ประวัติการเคลื่อนไหวของสินค้าแถวปัจจุบัน |
| Ctrl/Alt+2 | ยอดคงเหลือ |
| Ctrl/Alt+3 หรือ 4 | สูตรราคา / ราคาขาย (เปิด modal ตัวเดียวกัน) |
| Ctrl/Alt+6 | สินค้าทดแทน |
| Ctrl/Alt+8 | ล็อต (Lot) |
| Ctrl/Alt+E | หมายเหตุรายการสินค้า |
| Insert | แทรกแถวว่างเหนือแถวปัจจุบัน (ขณะแก้ไข) |
| Ctrl+F | กำหนดเป็นของแถม = ตั้งต้นทุนแถวเป็น 0 (ขณะแก้ไข) |
คีย์ 1/2/3/4/6/8/E ทำงานเฉพาะในแท็บ "รายละเอียด" และต้องมีรหัสสินค้าในแถว (ยกเว้น Ctrl+E ที่ต้องมีแถวเท่านั้น) ไม่มี F12 และไม่มีปุ่มลัดอื่น แม้คอมเมนต์ในโค้ดจะเอ่ยถึง F12 (:130) คลิกขวาที่แถวสินค้าเปิดเมนูรวมคำสั่งเดียวกัน (ItemGridContextMenu — ใช้เฉพาะจอนี้, :3800-3880) |
Modal ที่เรียกได้
ทั้งหมดเป็น modal ของ transaction ที่ใช้ร่วมกัน (รายละเอียดดู ป๊อปอัปซีเรียล ล็อต ยอดคงเหลือ ประวัติ สินค้าทดแทน (SerialNumberModal / LotModal / StockBalanceModal / ItemHistoryModal / ItemReplacementModal), ป๊อปอัปราคาขาย ต้นทุน และอนุมัติวงเงินเครดิต (PriceFormulaModal / PriceInfoModal / CostLockModal / CreditApproveModal), ป๊อปอัปเอกสารและรายการสินค้า (ChequePickerModal / DocumentFlowModal / ItemNameModal / ItemRemarkModal / ItemGridContextMenu)):
- ยอดคงเหลือ (
StockBalanceModal), ประวัติการเคลื่อนไหว (ItemHistoryModal), สินค้าทดแทน (ItemReplacementModal) - สูตรราคา/ราคาขาย (
PriceFormulaModal,:3956; Ctrl+3 และ Ctrl+4 และเมนูคลิกขวาทั้ง 2 รายการเปิด modal ตัวเดียวกัน) - Serial Number (
SerialNumberModal) และ Lot (LotModal) — ข้อมูลเก็บในแถว (serials,lot) แล้วส่งไปกับการบันทึก - ชื่อสินค้า (
ItemNameModal), หมายเหตุรายการ (ItemRemarkModal) - ตัวค้นหา lookup ทั่วไป (สินค้า, รูปแบบเอกสาร, คลัง, ที่เก็บ, สมุดรายวัน, รหัสบัญชี) ตามกลไก รายการข้อมูล ค้นหา lookup และ dialog กลาง (SmlDataList / SmlLookupModal / SmlDialog)
แท็บ "เพิ่มเติม"
รหัสสาขา · กลุ่มเอกสาร · ด้าน/ฝ่าย · รหัสแผนก · รหัสการจัดสรร · รหัสโครงการ · รหัสงาน · หมายเหตุ 2-5 (:3008-3260) payload ส่งทุกช่องไปกับการบันทึก (branchCode/docGroup/sideCode/departmentCode/allocateCode/projectCode/jobCode/remark2-5, :1552-1570) จอนี้ ไม่ได้ซ่อนช่องตาม edition (ไม่พบการอ่าน edition ในไฟล์)
แท็บ "GL" (ใบสำคัญ)
- ส่วนบน: เอกสารวันที่ (อ่านอย่างเดียว), ช่องติ๊ก บันทึกรายการบัญชีตรง (
glTransDirect, แก้ได้ขณะแก้ไข), เอกสารเลขที่, รหัสเอกสาร, เอกสารอ้างอิงวันที่/อ้างอิง, งวดบัญชี, ปีบัญชี, สมุดรายวัน (ค้นหา), ประเภทรายวัน (รายวัน / ยกมางวด / ปิดงวด / ปรับปรุง / ยอดยกมา), คำอธิบาย (:3261-3420) - ส่วนล่าง: ตาราง รหัสบัญชี · ชื่อบัญชี · คำอธิบาย · เดบิต · เครดิต · มิติ; มีแถว total และแถบ "ผลต่าง เดบิต - เครดิต" (
:3420-3690) ปุ่ม "เพิ่มแถวบัญชี" และปุ่มจัดการแถวมีเฉพาะเมื่อติ๊ก "บันทึกรายการบัญชีตรง" - ไม่ติ๊ก (ค่าเริ่มต้น): จอสร้างแถว GL ให้เองสองบรรทัด ตามยอดรวมสุทธิที่เปลี่ยนไป เดบิต 1131-00 "สินค้าคงเหลือสำเร็จรูป" / เครดิต 3110-00 "ทุนเรือนหุ้นสามัญ" (
:373-398) และตารางอ่านอย่างเดียว - ติ๊ก: ผู้ใช้คีย์ Dr/Cr เองได้ ต้องเดบิตเท่าเครดิตทั้งก้อน
การบันทึก
ปุ่ม บันทึก (Ctrl+S) ตรวจที่หน้าจอ แล้วส่ง POST /api/process/stocktools/stockbeginningsave (:1486-1650)
- ฝั่งหน้าจอ: ต้องมีเลขที่เอกสาร, วันที่เอกสาร, สินค้าอย่างน้อย 1 รายการ (แถวที่ไม่มีรหัสสินค้าจะถูกตัดทิ้ง); สินค้าที่มีหน่วยนับขนาน (
unit_type2/3) ต้องมีรหัสหน่วยขนาน และถ้าจำนวนไม่เป็น 0 ต้องมีจำนวนหน่วยขนานด้วย - ตัวเลขใน payload เป็นสตริงทศนิยม (qty 4 ตำแหน่ง, price 4, อัตราส่วน 6, เดบิต/เครดิต 2) ผ่าน
decimalSql— แต่ state ในจอเป็น JS number ไม่ใช่ decimal string เต็มรูป ดู ตัวเลข เงิน ภาษี และปี พ.ศ. ฝั่ง frontend (numeric.ts) - ฝั่ง Go (
StockBeginningSave:307-355, ตรวจในnewStockBeginningPlan:154-296): บังคับเลขที่ซ้ำ (rejectDuplicateที่ic_trans.doc_no + trans_flag 54), รูปแบบวันที่ YYYY-MM-DD / เวลา HH:MM, ซีเรียลซ้ำในเอกสาร, รหัสสินค้ามีอยู่จริง, หน่วยขนาน, และ เดบิต = เครดิต ของแถว GL ที่ส่งมา (ถ้ามีแถว) จากนั้นเขียนic_trans,ic_trans_detail, ซีเรียล, ล็อต,gl_journal/gl_journal_detailและ rebuild สต็อก/ต้นทุน/ซีเรียล ใน transaction เดียว (ล็อกเอกสารและสินค้าก่อนlockTransDoc/lockStockItems) — rebuild พลาด = ยกเลิกทั้งเอกสาร ผลของการ rebuild ดู เครื่องมือสต็อก กลุ่ม route stocktools (Stock Tools) - ถ้ารหัสบัญชีที่ส่งมาไม่มีใน
gl_chart_of_accountฝั่ง Go หาบัญชีใกล้เคียงแทน (ฝั่งเดบิตลอง 1131/1130/1140, ฝั่งเครดิต 3110/3100/3210) (:630-640) ผังบัญชีดู ผังบัญชี (Chart of Accounts: MasterDetailScreen 9001 / 9002)
การลบ
ปุ่ม ลบ ถามยืนยัน "คุณต้องการลบเอกสารเลขที่ ... หรือไม่?" แล้วเรียก POST /api/process/stocktools/stockbeginningdelete (:1685-1725) ฝั่ง Go ลบ GL, ซีเรียล, ล็อต, รายการ และหัวเอกสารแล้ว rebuild (sbDeleteRaw :484-492) เอกสารนี้ ลบจริง ไม่ใช่ออกใบยกเลิกแบบจอ จอยกเลิก/อนุมัติเอกสาร (UniversalCancelConfirmScreen)
ข้อควรระวัง
- ขัดกับ สินค้า/วัตถุดิบ คงเหลือยกมา (Stock Beginning Balance): โน้ตนั้นเขียนว่า "ไม่มี GL อัตโนมัติ" แต่จอนี้ใส่แถว Dr 1131-00 / Cr 3110-00 ให้เองเมื่อไม่ติ๊ก "บันทึกรายการบัญชีตรง" และส่งแถวไปกับ
glLinesเสมอ ฝั่ง Go ไม่ดูglDirectตอนตัดสินว่าจะเขียนใบสำคัญ — ขอแค่มีแถวที่รหัสบัญชีไม่ว่าง (stock_beginning.go:606-650) ผลคือการบันทึกตามค่าตั้งต้นจะได้ใบสำคัญgl_journalเสมอ รหัส 1131-00/3110-00 ฝังในโค้ดหน้าจอ ไม่ได้อ่านจากผังบัญชีของบริษัท (ถ้าไม่มีในผัง Go เปลี่ยนเป็นบัญชีใกล้เคียงเงียบ ๆ) - ตัวเลข
qty/price/sum_amountในจอเป็นnumber(ปัดด้วยmulDec/sumDecแต่ยังเก็บเป็น JS float ระหว่างพิมพ์) ผิดแนวทาง ตัวเลข เงิน ภาษี และปี พ.ศ. ฝั่ง frontend (numeric.ts) แม้จะส่ง API เป็นสตริง - คอมเมนต์ในโค้ดพูดถึง F12 บันทึก (
:130,1484,1726) แต่ที่ผูกจริงมีแค่ Ctrl+S / Esc / Ctrl-Alt+เลข / Insert / Ctrl+F - ปุ่ม "ปิดหน้าจอ / ยกเลิกการแก้ไข (Esc)" ขณะแก้ไขเอกสารที่มีอยู่จะ ยกเลิกการแก้ไขและโหลดเอกสารเดิมกลับ ไม่ปิดแท็บ ปิดแท็บได้เมื่อไม่ได้แก้ไข
- ไม่มีเมนู "ยกเลิก" ของ flag 54 ใน
UniversalCancelConfirmScreen— แก้ไขหรือลบแล้วบันทึกใหม่เท่านั้น - แก้ไขเอกสารเดิมแล้วบันทึก = ฝั่ง Go ลบแถวดิบของเอกสารทั้งชุดแล้วเขียนใหม่ทั้งหมด (
sbDeleteRawก่อน insert,stock_beginning.go:325-345) ไม่ใช่ update ทีละแถว
ที่มาในโค้ด
frontend/account/transaction/StockBeginningBalanceScreen.tsx:110-116TRANS_FLAG = 54/priceAfterLookup;:128-134รหัสเมนู/คีย์ลัดบน window;:361-398ยอดรวมและแถว GL อัตโนมัติ;:441-466คอลัมน์รายการ;:759-800โหลดรายการ;:834-900เลขที่เอกสาร/รูปแบบเอกสาร;:901-1060เริ่มใหม่/แก้ไข/ยกเลิก;:1155-1215ของแถม/แก้ไขแถว;:1286-1350เลือกสินค้า;:1486-1650บันทึก;:1685-1725ลบ;:1729-1906คีย์ลัด;:1964-2045แถบเครื่องมือ;:2268-2290แท็บ;:2327-2700ตารางสินค้า;:3008-3260แท็บเพิ่มเติม;:3261-3690แท็บ GL;:3795-3880เมนูคลิกขวาfrontend/account/tabs/screenRegistry.tsx:806ลงทะเบียนbackend/internal/application/process/stock_beginning.go:154-296ตรวจ/วางแผน;:307-355save;:356-390delete;:484-492ลบดิบ;:606-650เขียนใบสำคัญ- ดูเพิ่ม: จอบันทึกเอกสารธุรกรรม มุมมองผู้ใช้ (UniversalTransScreen) · หัวเอกสาร แผงล่าง และแท็บเสริมของจอเอกสาร (TransTopForm / TransBottomPanel / TransExtraTabs) · รายการเมนูเอกสาร จัดซื้อ ขาย สินค้าคงคลัง (transMenuMap หมวด 1-3) · สมุดรายวัน รายการบัญชี และผ่านรายการ (GL journal / gl_journal / gl_journal_detail) · สารบัญหน้าจอทั้งหมดของ SML Ai Account (ต้นไม้เมนู → หน้าจอ → โน้ต)