สมอง SML

คลังความรู้ / หน้าจอทีละจอ

#screens#transaction

บันทึกการขายสินทรัพย์ (เมนู 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)

ภาษีถูกหัก ณ ที่จ่าย และรายการบัญชี

การบันทึก / การลบ

  • บันทึก (Ctrl+S; Esc = ยกเลิกการแก้ไข ผ่าน useShortcuts :264): ต้องมีเลขที่เอกสารและสินทรัพย์อย่างน้อย 1 รายการ แล้ว POST op: "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)

ที่มาในโค้ด