บันทึกการขายสินทรัพย์ (เมนู 8005)
จอขายสินทรัพย์ถาวร (กลุ่มเมนู "ค่าเสื่อม" รหัส 8) บันทึกลงตาราง as_trans / as_trans_detail ที่ trans_flag = 1802 (ไม่ใช่ ic_trans) ถอดแบบจาก C# SMLERPSO._saleAssets (screen code ASS) เป็นจอเฉพาะ ไม่ผ่าน จอบันทึกเอกสารธุรกรรม มุมมองผู้ใช้ (UniversalTransScreen) ผลทางบัญชีและภาษีดู ขายสินทรัพย์ (Fixed Asset Sale) ส่วนการโอนค่าเสื่อมเข้าบัญชีดู โอนค่าเสื่อมราคาสินทรัพย์ (Depreciation Transfer)
หัวใจของจอ: หน้าจอรับค่าอย่างเดียว (รหัสสินทรัพย์ + ราคาขาย + หัวเอกสาร) ส่วนค่าเสื่อมสะสม มูลค่าตามบัญชี VAT กำไร/ขาดทุน และรายการบัญชีคำนวณฝั่ง Go ทั้งหมด (AssetSaleScreen.tsx:2-6)
วิธีเปิด
เมนู 8005 menu_asset_sale "บันทึกการขายสินทรัพย์" ลงทะเบียนเป็นเมนูแบบ factory ส่ง menuCode และ title เข้าจอ (screenRegistry.tsx:1112) กลไกเมนูดู ทะเบียนหน้าจอและโครงเมนู (Screen registry & smlMenu)
โครงจอ
แบ่งซ้าย/ขวาด้วย ResizableSplit (storageKey="sml_asset_sale_split", กว้างเริ่มต้น 480):
- ซ้าย: รายการเอกสาร ใช้
TransDocListPaneร่วมกับจอ transaction (หัวคอลัมน์ฝั่งคู่ค้าเขียนว่า "รหัสลูกหนี้ / ชื่อลูกหนี้") ช่วงวันที่เริ่มต้น = 1 ม.ค. ของปีนี้ถึงวันนี้ ค้นด้วยเลขที่เอกสาร / รหัสลูกหนี้ / ชื่อลูกหนี้ แสดงสูงสุด 500 แถว (:103-120) - ขวา: เอกสาร ใช้
ScreenFrameมีปุ่ม บันทึก · ปิดหน้าจอ (ในโหมดแก้ไขปุ่มนี้คือยกเลิกการแก้ไข) · แก้ไข · เพิ่มใหม่ · ลบ และ "ปิดหน้าจอ" ปิดแท็บเมื่อมีonClose(:316-344) กลไกร่วมของจอรายการ+เอกสารดู รายการข้อมูล ค้นหา lookup และ dialog กลาง (SmlDataList / SmlLookupModal / SmlDialog)
ส่วนหัวเอกสาร
| ช่อง | หมายเหตุ |
|---|---|
| วันที่เอกสาร * | DateBox เริ่มต้นวันนี้ |
| เวลา | HH:MM |
| เลขที่เอกสาร * | พิมพ์เป็นตัวพิมพ์ใหญ่ ยาวสูงสุด 25 แก้ได้เฉพาะเอกสารใหม่; ปุ่ม Auto สร้างเลขจากรูปแบบ ASS (generateDocNo, :208-216) |
| รูปแบบเอกสาร | อ่านอย่างเดียว (ค่าเริ่มต้น ASS) |
| ลูกหนี้ | ค้นหาจาก ar_customer |
| วันที่ใบกำกับภาษี / เลขที่ใบกำกับภาษี | เลขที่เว้นว่างได้ placeholder "(ว่าง = เลขที่เอกสาร)" |
| เอกสารอ้างอิง / วันที่อ้างอิง | ข้อความอิสระ 25 ตัว / วันที่ |
| ประเภทการขาย | ขายเงินเชื่อ / ขายเงินสด / ขายสินค้าเงินเชื่อ (สินค้าบริการ) / ขายสินค้าเงินสด (สินค้าบริการ) — ค่า 0..3 ตรงกับ ic_trans.inquiry_type (:48-50) |
| ประเภทภาษี | ภาษีแยกนอก / ภาษีรวมใน / ภาษีอัตราศูนย์ / ไม่กระทบภาษี (:51) ดู ประเภทภาษี แยกนอก/รวมใน และภาษีซื้อ-ขาย (VAT type / vat_type / gl_journal_vat_buy / gl_journal_vat_sale) |
ส่วนท้ายของหัว: จำนวนวันเครดิต (จำนวนเต็ม), วันครบกำหนด, อัตราภาษี (%) (ว่าง = ใช้อัตราตามระบบที่ backend ส่งกลับมาแสดง), หมายเหตุ (255 ตัว) แล้วช่องคำนวณอ่านอย่างเดียว: มูลค่าสินค้า · มูลค่าก่อนภาษี · ภาษีมูลค่าเพิ่ม · มูลค่าหลังภาษี · มูลค่ายกเว้นภาษี · รวมทั้งสิ้น (:485-551)
ตารางรายการสินทรัพย์ที่ขาย
คอลัมน์ # · รหัสสินทรัพย์ (พิมพ์หรือกดค้นหา) · ชื่อสินทรัพย์ · มูลค่าสินทรัพย์ · ค่าเสื่อมราคาสะสม · มูลค่าตามบัญชี · ราคาขาย · จัดการ — มีสองช่องที่กรอกได้เท่านั้น: รหัสสินทรัพย์ และ ราคาขาย ที่เหลือแสดงผลที่ backend คำนวณ (:405-484)
- ปุ่มค้นหาสินทรัพย์เปิด
SmlLookupModalบนตารางas_assetโดยกรองเฉพาะสินทรัพย์ที่ ยังไม่ถูกขาย:code not in (select item_code from as_trans_detail where trans_flag = 1802 and last_status = 0 and doc_no <> <เอกสารที่เปิดอยู่>)(:271) จึงแก้เอกสารที่ขายสินทรัพย์ชิ้นเดิมได้ แต่ชิ้นที่ขายในใบอื่นจะไม่โผล่ - ปุ่ม เพิ่มบรรทัด (สูงสุด 500 แถว) · ปุ่มลบแถว (ถ้าเหลือแถวเดียว = ล้างแถวนั้น) · ปุ่มเลื่อนแถวขึ้น/ลง (
RowMoveButtons) - ข้อความช่วยท้ายตาราง: "ค้นหาเฉพาะสินทรัพย์ที่ยังไม่ขาย · กรอกราคาขาย ระบบคำนวณค่าเสื่อมราคาสะสม มูลค่าตามบัญชี และกำไร(ขาดทุน) ให้อัตโนมัติ"
ตัวอย่างผลคำนวณ (preview)
ทุกครั้งที่รายการ ประเภทภาษี อัตราภาษี ประเภทการขาย หรือวันที่เอกสารเปลี่ยน (ขณะแก้ไข) จอรอ 350 ms แล้วเรียก POST /api/process/workflow/asset-sale ด้วย op: "preview" แล้วเอาผลมาเติมมูลค่าต่อแถว ยอดรวม และตารางรายการบัญชี (:192-207) ถ้า backend ปฏิเสธ (เช่น ไม่พบผังบัญชีกำไรขาดทุน) ข้อความ error ขึ้นแทนผล และคำตอบเก่าที่ช้ากว่าจะถูกทิ้ง (ตัวนับ previewSeq)
ภาษีถูกหัก ณ ที่จ่าย และรายการบัญชี
- ใต้ตารางมี
JournalTaxTabsแท็บwhtOut(ภาษีหัก ณ ที่จ่ายฝั่งผู้ขายที่ถูกหัก) แก้ได้ขณะแก้ไข ใช้ lookup ตารางเฉพาะของแท็บนั้น ดู หัวเอกสาร แผงล่าง และแท็บเสริมของจอเอกสาร (TransTopForm / TransBottomPanel / TransExtraTabs) และ ภาษีหัก ณ ที่จ่าย / ภาษีถูกหัก (withholding tax / gl_wht_list) ส่งค่าไปเป็นwhtตอนบันทึกเพื่อให้ backend เขียนgl_wht_list(:6,:552-564) - รายการบัญชี: เลือก "สมุดรายวัน" (จาก
gl_journal_book, ค่าเริ่มต้น04) ตารางผลลัพธ์รหัสบัญชี · ชื่อบัญชี · เดบิต · เครดิต พร้อมข้อความ "กำไร/ขาดทุนจากการขายสินทรัพย์ <จำนวน>" และสถานะ "เดบิต = เครดิต (สมดุล)" เทียบสตริงยอดเดบิต/เครดิตที่ backend ส่ง (:565-613) ตารางนี้อ่านอย่างเดียว กลไก GL ดู สมุดรายวัน รายการบัญชี และผ่านรายการ (GL journal / gl_journal / gl_journal_detail)
การบันทึก / การลบ
- บันทึก (Ctrl+S; Esc = ยกเลิกการแก้ไข ผ่าน
useShortcuts:264): ต้องมีเลขที่เอกสารและสินทรัพย์อย่างน้อย 1 รายการ แล้วPOSTop: "save"พร้อมoldDocNo(ถ้าเป็นการแก้เอกสารเดิม) และwhtเสร็จแล้วโหลดรายการ+เอกสารใหม่ (:235-247) - ฝั่ง Go ตรวจ (
fa_sale.go:218-275): ต้องมีรหัสลูกหนี้ ("กรุณาป้อน รหัสลูกค้า"), วันที่ถูกต้อง, ประเภทภาษี/ประเภทการขายในช่วง, วันเครดิต, สินทรัพย์ 1-500 รายการ, รหัสสินทรัพย์ไม่ซ้ำในเอกสาร, ราคาขายถูกต้อง, อัตราภาษี 0-100, เลขที่เอกสารไม่ซ้ำ ("มีอยู่แล้ว") และต่อสินทรัพย์ (:300-315): ไม่พบสินทรัพย์ / ขายไปแล้วในเอกสารอื่น / ยังไม่กำหนดรหัสบัญชีสินทรัพย์และค่าเสื่อม; ต้องมีผังบัญชีกำไร(ขาดทุน)จากการจำหน่าย (:368); รายการบัญชีต้องสมดุล (:374) - ลบ (ลบได้ทีละเอกสาร ผ่าน dialog ยืนยัน "ลบเอกสารขายสินทรัพย์ ... ใช่หรือไม่? (ลบรายการบัญชีและคืนสถานะสินทรัพย์)") ส่ง
op: "delete"ผลสำเร็จ "ลบเอกสาร ... แล้ว สินทรัพย์กลับเป็นสถานะยังไม่ขาย" (:248-263) — ลบจริง ไม่ใช่ออกใบยกเลิก - สิทธิ์: ฝั่ง HTTP ตัดสิทธิ์ตาม
op(previewไม่ต้องสิทธิ์เขียน)permission.go:118ดู การตรวจสิทธิ์เมนูของ route process (Process route rights)
ข้อควรระวัง
- ลูกหนี้ไม่มีเครื่องหมาย * บนจอ แต่ backend บังคับ ("กรุณาป้อน รหัสลูกค้า") จึงเพิ่งเจอข้อผิดพลาดตอนกดบันทึก (
AssetSaleScreen.tsx:368เทียบfa_sale.go:231) - ไม่มีแท็บรับชำระ (เช็ค/โอน/มัดจำ) แม้เลือกประเภทการขายเป็นเงินสด — คอมเมนต์ท้ายหัวไฟล์ระบุว่ายังไม่ทำ (
:7) - สินทรัพย์ที่เลือกซ้ำในเอกสารเดียวกันถูกปฏิเสธที่ backend ไม่ใช่ที่จอ
- ตัวเลขต่อแถว/ยอดรวมเป็นสตริงทศนิยมจาก backend แสดงผ่าน
formatMoneyDisplayไม่คำนวณในหน้าจอ ตรงกับ ตัวเลข เงิน ภาษี และปี พ.ศ. ฝั่ง frontend (numeric.ts) - เปิดเอกสารเก่า (
loadDoc) ดึงตรงจากas_trans/as_trans_detail/gl_journal_detail/WHT ไม่เรียก preview ใหม่ จึงเห็น "ค่าที่บันทึกจริง" ไม่ใช่ค่าที่คำนวณวันนี้ (:129-180) และสำหรับเอกสารที่เปิดจากฐานข้อมูลtotalCost/totalAccumDepถูกตั้งเป็นค่าว่าง (:171)
ที่มาในโค้ด
frontend/account/transaction/AssetSaleScreen.tsx:2-6หัวไฟล์;:30-33API/FLAG = 1802;:48-51ชนิดการขาย/ภาษี;:103-120รายการเอกสาร;:129-180เปิดเอกสาร;:181-191payload;:192-207preview;:208-216เลขที่เอกสาร;:217-263เริ่มใหม่/ยกเลิก/บันทึก/ลบ;:264คีย์ลัด (Ctrl+S / Esc);:271กรองสินทรัพย์ที่ยังไม่ขาย;:316-344แถบเครื่องมือ;:346-404หัวเอกสาร;:405-484ตาราง;:485-551ยอดรวม;:552-613WHT/รายการบัญชี;:614-646lookup/dialogfrontend/account/tabs/screenRegistry.tsx:1112backend/internal/application/process/fa_sale.go:159คำนวณ;:218-275ตรวจ input;:300-315ตรวจสินทรัพย์;:368-374ผังบัญชี/สมดุล;:379ตัวจัดการ opbackend/internal/adapter/inbound/http/process/permission.go:118;workflow_handler.go:80- ดูเพิ่ม: จอเอกสารธุรกรรมแบบเดียวกันทุกจอ (UniversalTransScreen) · หัวเอกสารสินทรัพย์ (as_trans) · รายการเอกสารสินทรัพย์ (as_trans_detail) · สารบัญหน้าจอทั้งหมดของ SML Ai Account (ต้นไม้เมนู → หน้าจอ → โน้ต)