แถบเครื่องมือผังบัญชี (ChartOfAccountToolsBar)
แถบด้านบนของจอ ผังบัญชี (Chart of Accounts: MasterDetailScreen 9001 / 9002) ทั้งเมนู 9001 (menu_chart_of_account) และ 9002 (menu_chart_of_account_fast) มี 3 ปุ่ม: "แม่แบบผังบัญชี TFRS" (เพิ่มชุดบัญชีมาตรฐานที่ยังไม่มี), "ส่งออก CSV / Excel" และ "นำเข้า CSV" ทั้งหมดอยู่ในคอมโพเนนต์ ChartOfAccountToolsBar ที่ หน้าจอข้อมูลหลัก + ตารางย่อย (MasterDetailScreen) วางไว้เหนือส่วนแสดงข้อผิดพลาดและเนื้อหา (MasterDetailScreen.tsx:1198-1207)
คอมโพเนนต์นี้เขียนตาราง gl_chart_of_account ด้วยคำสั่ง SQL โดยตรงผ่าน queryExecBatch ไม่ใช้ master-detail/save ของ Go
วิธีเปิด
| ที่ | เงื่อนไข | หลักฐาน |
|---|---|---|
| 9001 รายละเอียดผังบัญชี | config.menuKey === "menu_chart_of_account" ส่ง existingCodes = รหัสจากรายการซ้าย (rows) |
MasterDetailScreen.tsx:1198-1203 |
| 9002 ปรับปรุงผังบัญชีแบบเร็ว | config.menuKey === "menu_chart_of_account_fast" ส่ง existingCodes = รหัสจากกริด accounts |
MasterDetailScreen.tsx:1198-1202 |
onRefresh ของแถบเรียก setRefreshKey เพื่อให้จอกลางโหลดรายการใหม่หลังเพิ่ม/นำเข้า (MasterDetailScreen.tsx:1205)
ปุ่ม / คีย์ลัด
| ปุ่ม | data-testid |
ทำอะไร |
|---|---|---|
| แม่แบบผังบัญชี TFRS | coa-open-template-btn |
เปิดโมดัลเลือกชุดแม่แบบ |
| ส่งออก CSV / Excel | coa-export-csv-btn |
ดึงผังบัญชีทั้งตารางแล้วดาวน์โหลดเป็นไฟล์ CSV |
| นำเข้า CSV | coa-open-import-btn |
เปิดโมดัลนำเข้า (วางข้อความหรือเลือกไฟล์) |
ทุกปุ่มถูกปิดระหว่างที่งานกำลังทำ (busy) ไม่มีคีย์ลัดเฉพาะของแถบนี้ ผลลัพธ์แสดงเป็นแถบข้อความสีเขียว/แดงใต้แถบ (coa-tools-banner) ที่กดปิดได้ — ChartOfAccountToolsBar.tsx:172-186,388-440
โมดัล "เลือกแม่แบบผังบัญชีมาตรฐานไทย (TFRS for NPAEs)"
- 3 ชุด (
CoaTemplatePack):trading"ธุรกิจซื้อมาขายไป" (38 บัญชี),service"ธุรกิจบริการ" (38 บัญชี),manufacturing"ธุรกิจผลิตและโรงงาน" (42 บัญชี) แต่ละชุด = บัญชีแกนกลางCORE_COA_ROWS32 บัญชี + บัญชีเฉพาะชุด (6 / 6 / 10) เรียงตามรหัส — ChartOfAccountToolsBar.tsx:30-119 - การ์ดแต่ละชุดแสดงจำนวนบัญชีและ "ขาด N" (จำนวนที่ยังไม่มีในระบบ) ตารางด้านล่างแสดงรหัสบัญชี / ชื่อไทย / ชื่ออังกฤษ / บัญชีคุม (
main_code) / หมวดบัญชี / สถานะในระบบ ("มีแล้ว" หรือ "+ เพิ่มใหม่") และเยื้องชื่อตามระดับบัญชี - ข้อความกำกับ: "ระบบจะเพิ่มเฉพาะรหัสบัญชีที่ยังไม่มีในฐานข้อมูล (ไม่ทับรหัสบัญชีเดิมของกิจการ)"
- ปุ่ม "เพิ่มผังบัญชีที่ยังไม่มี (N บัญชี)" เรียก
handleApplyTemplate: ถ้าไม่ขาดเลยแสดง "ผังบัญชีในชุด ... มีครบในฐานข้อมูลแล้วทั้งหมด" แล้วปิดโมดัล ไม่ก็สร้าง SQL ต่อบัญชีที่ขาดด้วยbuildCoaUpsertSqlแล้วส่งqueryExecBatchครั้งเดียว สำเร็จแล้วแสดง "เพิ่มผังบัญชีมาตรฐาน (...) สำเร็จ N บัญชี" และรีโหลดรายการ — ChartOfAccountToolsBar.tsx:197-200,238-262 buildCoaUpsertSqlเขียนแบบINSERT ... SELECT ... WHERE NOT EXISTS (จับคู่ UPPER(code))กำหนดคอลัมน์code,name_1,name_2,main_code,account_level,account_type,status,balance_mode,tax_type,balance_sheet_status,account_closeและactive_status = 1ไม่ได้กำหนดกลุ่มบัญชี / กลุ่มกระแสเงินสด / ธงแยกหน่วยงาน-แผนก-โครงการ (ค่าที่เหลือเป็นค่าเริ่มต้นของตาราง) — ChartOfAccountToolsBar.tsx:154-170
ส่งออก CSV
handleExportCsv อ่านทุกแถวของ gl_chart_of_account เรียงตามรหัส 12 คอลัมน์ (code, name_1, name_2, main_code, account_level, account_type, status, balance_mode, tax_type, balance_sheet_status, account_close, active_status) ผ่าน queryList (ซึ่งดึงทุกแถว — query-client.ts:13-20) สร้างไฟล์ UTF-8 มี BOM ขึ้นบรรทัดใหม่แบบ CRLF ชื่อไฟล์ gl_chart_of_account_<วันที่ ISO>.csv แล้วสั่งดาวน์โหลดทันที — ChartOfAccountToolsBar.tsx:264-323
นำเข้า CSV
- โมดัล "นำเข้าผังบัญชีจากไฟล์ CSV / Excel": ปุ่ม "เลือกไฟล์ .CSV จากเครื่อง" (อ่านเป็น UTF-8 ลงกล่องข้อความ), ปุ่ม "เติมตัวอย่าง CSV" (ตัวอย่าง 2 แถว), กล่องข้อความวาง CSV (
coa-import-textarea), ข้อความ "ตรวจพบ N แถวพร้อมนำเข้า" และตารางตัวอย่างพร้อมป้าย "เพิ่มรหัสใหม่" / "อัปเดตรหัสเดิม" - ลำดับคอลัมน์ที่อ่าน:
code,name_1,name_2,main_code,account_level,account_type,status,balance_mode,tax_type,balance_sheet_status,account_close(ข้ามบรรทัดหัวที่คอลัมน์แรกเป็นCODEหรือ "รหัสบัญชี" และข้ามแถวที่ไม่มีรหัสหรือไม่มีname_1; รหัสและmain_codeแปลงเป็นตัวพิมพ์ใหญ่) — ChartOfAccountToolsBar.tsx:130-152,202-236 - ค่าเริ่มต้นเมื่อ "ไม่มีคอลัมน์นั้นในแถว":
account_typeจากเลขหลักแรกของรหัส (1-5 → 0-4 ไม่งั้น 0),balance_mode= 1 (เครดิต) เมื่อประเภทเป็น 1-3 ไม่งั้น 0,account_level= 1 ถ้ามีmain_codeไม่งั้น 0,status= 0 ถ้ามีmain_codeไม่งั้น 1,balance_sheet_status= 3 เมื่อประเภทเป็น 4 ไม่งั้น 0,account_close=3210-00เมื่อประเภทเป็น 3 หรือ 4 ไม่งั้นว่าง — ChartOfAccountToolsBar.tsx:218-232 - ปุ่ม "นำเข้าผังบัญชี (N รายการ)" เรียก
handleImportCsv: รหัสที่มีอยู่ในexistingCodes→UPDATE(ชื่อ,main_code, ระดับ, ประเภท, สถานะ, ด้านบัญชี, ภาษี, ผลกระทบงบ, บัญชีปิด; ไม่แตะactive_statusและฟิลด์อื่น) ส่วนรหัสใหม่ →buildCoaUpsertSqlแล้วส่งqueryExecBatchครั้งเดียว สำเร็จแล้วแสดง "นำเข้าและอัปเดตผังบัญชีจาก CSV สำเร็จ N รายการ" ล้างกล่องข้อความและรีโหลดรายการ — ChartOfAccountToolsBar.tsx:325-361
API / process actions
POST /api/query/execBatch{sql: string[]}(ผ่านฟังก์ชันqueryExecBatch) — Go รันทุกคำสั่งใน 1 transaction ถ้าคำสั่งใดล้มเหลวจะย้อนทั้งชุด — query-client.ts:61-67; backend/internal/application/query/port.go:100-107POST /api/query/list(ผ่านqueryList) สำหรับส่งออก — query-client.ts:13-20
ตารางที่ข้อมูลลงไป
- ผังบัญชี (gl_chart_of_account) เท่านั้น
ข้อควรระวัง
- แถบนี้ไม่ผ่านกติกาตรวจของ Go ที่ใช้กับการบันทึกปกติ (
master_detail_specs.goตรวจช่วงค่า, การมีอยู่ของบัญชีหลัก/กลุ่มบัญชี — ผังบัญชี (Chart of Accounts: MasterDetailScreen 9001 / 9002)) ค่าจาก CSV ถูกใส่ลงในคำสั่ง SQL หลังผ่านescapeSqlส่วนตัวเลขใช้Number()โดยตรง จึงไม่มีการตรวจช่วงค่า 0-4 / 0-7 ฝั่งแถบ (อ่านจากโค้ด ยังไม่ได้ทดสอบกับข้อมูลจริง) - ช่อง CSV ที่มีคอลัมน์แต่เว้นว่างจะถูกอ่านเป็น 0 เพราะ
Number("") = 0ถือเป็นตัวเลขที่ใช้ได้ ค่าเริ่มต้นข้างต้นจึงใช้เฉพาะเมื่อแถวสั้นจนไม่มีคอลัมน์นั้นเลย - ใน 9001 รายการ
existingCodesมาจากรายการซ้ายที่โหลดสูงสุด 500 แถวและกรองตามคำค้นที่ใช้อยู่ (queryLimit(sql, 500, 0, true)— MasterDetailScreen.tsx:250-252) ถ้ารหัสที่นำเข้ามีอยู่ในฐานข้อมูลแต่ไม่อยู่ในรายการที่เห็น แถบจะถือเป็นรหัสใหม่ → ใช้INSERT ... WHERE NOT EXISTSซึ่งไม่เพิ่มและไม่แก้แถวเดิม แต่ข้อความสำเร็จยังนับรวมแถวนั้น (อนุมานจากโค้ด ยังไม่ได้ทดสอบ) ใน 9002 ใช้รหัสจากกริดที่โหลดสูงสุด 2000 แถว (MasterDetailScreen.tsx:142-157) - ชื่อชุดบนจอระบุ "TFRS for NPAEs" ตามข้อความในโค้ด ความถูกต้องของรหัส/หมวดตามมาตรฐานบัญชีไทยยังไม่ได้ตรวจในบันทึกนี้ ผู้ใช้ควรทบทวนผังกับนักบัญชีก่อนใช้จริง
- การอัปเดตจาก CSV ทับ
name_1,name_2,main_code, ระดับ, ประเภท, สถานะ, ด้านบัญชี, ภาษี, ผลกระทบงบ และaccount_closeของบัญชีเดิมทั้งหมดตามไฟล์ ไม่มีขั้นยืนยันก่อนส่งนอกจากตารางตัวอย่างในโมดัล
ที่มาในโค้ด
frontend/account/master/ChartOfAccountToolsBar.tsx:30-119,122-170— แม่แบบ 3 ชุด, ป้ายหมวด,parseCsvLine,buildCoaUpsertSqlfrontend/account/master/ChartOfAccountToolsBar.tsx:172-262— state, การคำนวณรายการที่ขาด, การแยกวิเคราะห์ CSV,handleApplyTemplatefrontend/account/master/ChartOfAccountToolsBar.tsx:264-361—handleExportCsv,handleImportCsvfrontend/account/master/ChartOfAccountToolsBar.tsx:388-716— ปุ่ม แถบแจ้งผล และโมดัลทั้งสองfrontend/account/master/MasterDetailScreen.tsx:250-252,1198-1207— ที่ติดตั้งแถบและที่มาของexistingCodesfrontend/src/lib/query-client.ts:13-20,61-67,backend/internal/application/query/port.go:100-107— ช่องทางอ่าน/เขียน SQL- ดูเพิ่ม: ผังบัญชี (Chart of Accounts: MasterDetailScreen 9001 / 9002) หน้าจอข้อมูลหลัก + ตารางย่อย (MasterDetailScreen) ผังบัญชี (gl_chart_of_account)