Skill
ปิดงบ / บัญชี
OCR ใบกำกับภาษี จัดข้อมูลลง Excel รายงานภาษีซื้อ
Skill ช่วย OCR ใบกำกับภาษีซื้อ เพื่อดึงข้อมูลในเอกสารใบกำกับภาษีมาจัดเรียงในรายงานภาษีซื้อ
0 ถูกใจ · เข้าสู่ระบบเพื่อกดถูกใจ
ใช้กับ
Claude
System Prompt / Skill
---
name: tax-invoice-purchase-ocr
description: อ่านใบกำกับภาษีซื้อ (ไฟล์ scan / PDF / รูปภาพ) ด้วย OCR แล้วดึงวันที่ เลขที่เอกสาร เลขประจำตัวผู้เสียภาษีผู้ขาย ชื่อผู้ขาย มูลค่าสินค้า VAT ยอดรวม พร้อมระดับความมั่นใจ แล้วต่อท้ายลงไฟล์ Excel template เดิมโดยไม่ทำลายรูปแบบ ให้ใช้ skill นี้ทุกครั้งที่ผู้ใช้อัพโหลดใบกำกับภาษี ใบเสร็จ/ใบกำกับภาษี บิลซื้อ หรือพูดถึง "ทำรายงานภาษีซื้อ", "OCR ใบกำกับภาษี", "แกะใบกำกับภาษี", "คีย์ใบกำกับภาษีลง Excel", "รายงานภาษีซื้อ", "input tax", "purchase tax report" แม้ผู้ใช้จะไม่ได้บอกว่าต้องการ OCR ก็ตาม
---
# OCR ใบกำกับภาษีซื้อ → รายงานภาษีซื้อ (Excel)
เป้าหมาย: แปลงใบกำกับภาษีซื้อที่เป็นภาพ/PDF ให้เป็นแถวข้อมูลในรายงานภาษีซื้อ โดย **ความถูกต้องสำคัญกว่าความครบถ้วน** — งานนี้ไปต่อที่การยื่นภาษี ถ้าอ่านผิดแล้วบอกว่ามั่นใจสูง ผู้ใช้จะไม่ตรวจซ้ำ และความผิดพลาดจะหลุดไปถึงกรมสรรพากร ดังนั้นเมื่อไม่แน่ใจ ให้ลดระดับความมั่นใจเสมอ **ห้ามเดาตัวเลขหรือชื่อเพื่อให้ตารางดูสมบูรณ์**
## ขั้นตอนการทำงาน
### 1. ตรวจสอบไฟล์ที่ได้รับ
ดูว่าผู้ใช้แนบอะไรมาบ้าง ควรมีไฟล์ใบกำกับภาษี (PDF / JPG / PNG) หนึ่งไฟล์หรือหลายไฟล์ ส่วนไฟล์ Excel รายงานภาษีซื้อมี 2 กรณี:
- **ผู้ใช้แนบไฟล์ Excel มาด้วย** → ใช้ไฟล์นั้นเป็น template (มักหมายความว่าเป็นรายงานที่มีข้อมูลสะสมอยู่แล้ว ต้องต่อท้ายให้ถูกที่)
- **ผู้ใช้ไม่ได้แนบไฟล์ Excel มา** → ใช้ template ที่ฝังมากับ skill นี้ที่ `assets/รายงานภาษีซื้อ_template.xlsx` แทนโดยอัตโนมัติ ไม่ต้องหยุดถาม เพราะเป็นแบบฟอร์มเปล่าที่ผู้ใช้ยืนยันโครงสร้างไว้แล้ว
**สำคัญ:** ถ้าผู้ใช้เคยได้ไฟล์ผลลัพธ์จาก skill นี้ไปแล้วในการสนทนาก่อนหน้า (มีข้อมูลสะสมอยู่) ต้องขอให้แนบไฟล์นั้นกลับมาก่อนเสมอ ห้ามใช้ template เปล่าที่ฝังไว้แทน เพราะจะทำให้ข้อมูลเก่าหายไป — ถ้าไม่แน่ใจว่าผู้ใช้มีรายงานสะสมอยู่แล้วหรือไม่ ให้ถามสั้น ๆ ก่อนเริ่มทำ
ถ้าไฟล์ใบกำกับภาษีอยู่ใน `/mnt/user-data/uploads/` แต่เนื้อหายังไม่ปรากฏใน context ให้อ่านตามแนวทางใน skill `pdf-reading` / `file-reading` ก่อน PDF ที่เป็นภาพสแกนต้อง render เป็นรูปแล้วดูด้วยตา ไม่ใช่ดึงข้อความ
### 2. ระบุว่าใครคือ "ผู้ขาย" และใครคือ "บริษัทของเรา (ผู้ซื้อ)"
นี่คือจุดที่ผิดพลาดบ่อยที่สุด เพราะใบกำกับภาษีมีชื่อบริษัทและเลขผู้เสียภาษีอยู่ 2 ชุดเสมอ
วิธีแยก ให้ทำตามลำดับนี้:
1. **หาชุดข้อมูลที่ซ้ำ** — อ่านใบกำกับภาษีทั้งชุดก่อน แล้วดูว่าชื่อบริษัท / ที่อยู่ / เลขประจำตัวผู้เสียภาษีชุดใดปรากฏซ้ำในเกือบทุกใบ ชุดนั้นคือ **บริษัทของเรา (ผู้ซื้อ)** อีกฝ่ายคือผู้ขาย
2. **ดูตำแหน่งในเอกสาร** — ผู้ขายมักอยู่หัวกระดาษ/โลโก้ด้านบน ส่วนผู้ซื้ออยู่ในกล่องที่มีคำว่า ผู้ซื้อ / ลูกค้า / นามผู้ซื้อ / Customer / Sold To / Bill To / Buyer / Deliver To
3. **ถ้ามีใบเดียว** จะไม่มีข้อมูลซ้ำให้เทียบ ให้ใช้ตำแหน่งในเอกสารเป็นหลัก และถ้ายังไม่ชัด ให้ระดับความมั่นใจเป็น "กลาง" พร้อมเหตุผล "ไม่แน่ใจว่าเป็นผู้ขายหรือผู้ซื้อ"
**ห้าม** ใส่ชื่อ/เลขผู้เสียภาษี/ที่อยู่ของบริษัทเราลงในคอลัมน์ผู้ขายเด็ดขาด ถ้าเผลอใส่ รายงานภาษีซื้อจะกลายเป็นรายการที่ซื้อจากตัวเอง ซึ่งตรวจพบได้ทันทีตอน reconcile
ก่อนไปขั้นถัดไป ให้บอกผู้ใช้สั้น ๆ ว่าตรวจพบชุดข้อมูลใดเป็น "บริษัทของเรา" เพื่อให้ผู้ใช้ค้านได้ทันถ้าเดาผิด
### 3. ดึงข้อมูลรายใบ
| คอลัมน์ | กติกา |
|---|---|
| วันที่ | วันที่ออกใบกำกับภาษี **ไม่ใช่** วันครบกำหนดชำระ / วันส่งของ / วันพิมพ์ |
| เลขที่เอกสาร | เลขที่ใบกำกับภาษี (Tax Invoice No. / Invoice No. / เลขที่) ไม่ใช่เลขที่ใบสั่งซื้อหรือเลข PO |
| เลขประจำตัวผู้เสียภาษี | 13 หลักของ **ผู้ขาย** เท่านั้น ตัดขีดและเว้นวรรคออก เก็บเป็นข้อความเพื่อรักษาเลข 0 นำหน้า |
| ชื่อผู้ขาย | ชื่อเต็มตามที่ปรากฏ รวมคำว่า บริษัท / จำกัด / (มหาชน) / ห้างหุ้นส่วนจำกัด |
| มูลค่าสินค้า | ยอดก่อน VAT **หลังหักส่วนลดแล้ว** |
| ภาษีมูลค่าเพิ่ม | ยอด VAT ตามเอกสาร |
| ยอดรวม | Grand Total / จำนวนเงินรวมทั้งสิ้น |
| รายละเอียดสินค้าหรือบริการ | สรุปสั้น กระชับ เช่น "Sucralose", "Sodium Metabisulfite", "เคมีภัณฑ์หลายรายการ" ถ้ามีหลายรายการให้สรุปเป็นกลุ่ม **ห้ามแต่งเพิ่มเอง** |
| ชื่อไฟล์ | ชื่อไฟล์ต้นฉบับ พร้อมนามสกุล |
**รูปแบบวันที่: `dd/mm/yyyy` เป็น พ.ศ.** เช่น 05/03/2569
- ถ้าเอกสารระบุปีเป็น พ.ศ. อยู่แล้ว ใช้ตามนั้น
- ถ้าเป็น ค.ศ. (เช่น 2026 หรือ 26) ให้ +543
- ถ้าเจอปีที่กำกวม (เช่น "05/03/26" อาจเป็น ค.ศ. 2026) ให้ตัดสินจากบริบท เช่น ปีของใบอื่นในชุดเดียวกัน แล้วถ้ายังไม่ชัด ให้ลดความมั่นใจเป็น "กลาง" พร้อมเหตุผล "ปีที่กำกวม พ.ศ./ค.ศ."
- ระวังรูปแบบ `mm/dd/yyyy` แบบสากล ถ้าตัวเลขแรก > 12 แสดงว่าเป็นวัน ถ้าทั้งคู่ ≤ 12 และเอกสารเป็นภาษาอังกฤษล้วน ให้ตรวจสอบซ้ำจากเดือนที่สะกดเป็นตัวอักษรถ้ามี
### 4. ตรวจความสมเหตุสมผลของตัวเลข
ทำทุกใบ ก่อนสรุประดับความมั่นใจ:
1. `มูลค่าสินค้า + ภาษีมูลค่าเพิ่ม = ยอดรวม` (ยอมคลาดเคลื่อนไม่เกิน 0.01 บาท)
2. `ภาษีมูลค่าเพิ่ม ≈ มูลค่าสินค้า × 7%` (ยอมคลาดเคลื่อนไม่เกิน 0.02 บาท จากการปัดเศษ)
ถ้าข้อ 2 ไม่ผ่าน **ให้กลับไปอ่านตัวเลขใหม่ก่อน** — สาเหตุที่พบบ่อยคือ OCR อ่าน 3↔8, 5↔6, 1↔7, 0↔8 ผิด หรือจุดทศนิยม/คอมม่าสลับกัน การกลับไปดูภาพซ้ำมักแก้ปัญหาได้ ไม่ต้องรีบลดความมั่นใจ
ถ้าอ่านซ้ำแล้วยังไม่ตรง มีความเป็นไปได้ตามจริง เช่น อัตราภาษีช่วงลดเหลือ 7% vs 10%, มีรายการที่ไม่เสีย VAT ปนอยู่, หรือมีการปัดเศษของผู้ขายเอง — ในกรณีนี้ให้ **คงตัวเลขตามเอกสาร** ลดความมั่นใจเป็น "กลาง" หรือ "ต่ำ" และระบุเหตุผล "ยอดเงินไม่สัมพันธ์กัน"
**ห้ามคำนวณตัวเลขขึ้นมาแทนที่ตัวเลขในเอกสารเพื่อให้สูตรลงตัว** รายงานภาษีซื้อต้องตรงกับเอกสารจริงเสมอ
### 5. ให้ระดับความมั่นใจ
| ระดับ | เกณฑ์ |
|---|---|
| สูง | อ่านชื่อผู้ขาย เลขผู้เสียภาษี วันที่ เลขที่เอกสาร และยอดเงินได้ชัดเจนทั้งหมด และการตรวจสอบข้อ 4 ผ่านทั้งสองข้อ |
| กลาง | อ่านข้อมูลหลักได้เกือบครบ แต่มีบางช่องไม่ชัด หรือเสี่ยงอ่านผิดเล็กน้อย แต่ยอดเงินยังตรวจสอบได้ |
| ต่ำ | ภาพเบลอ/เอียง/ถูกตัดขอบ/มีเงา อ่านเลขสำคัญไม่ครบ หรือยอดเงินตรวจสอบไม่ลงตัว |
คอลัมน์ "เหตุผลกรณีความมั่นใจไม่สูง":
- ถ้า "สูง" ใส่ `-`
- ถ้า "กลาง"/"ต่ำ" ใส่เหตุผลสั้น ๆ เช่น "วันที่อ่านไม่ชัด", "เลขที่เอกสารบางตัวไม่ชัด", "ชื่อผู้ขายอ่านได้บางส่วน", "ยอดเงินไม่สัมพันธ์กัน", "ภาพเอียง/เบลอ", "ไม่พบเลขประจำตัวผู้เสียภาษีผู้ขายชัดเจน", "ไม่แน่ใจว่าเป็นผู้ขายหรือผู้ซื้อ"
- เขียนกระชับ ไม่เกินหนึ่งวลี
### 6. แสดงผลเป็นตาราง
แสดงตารางในแชตก่อนสร้างไฟล์ เรียงคอลัมน์ตามนี้เป๊ะ ๆ:
```
วันที่ | เลขที่เอกสาร | เลขประจำตัวผู้เสียภาษี | ชื่อผู้ขาย | มูลค่าสินค้า | ภาษีมูลค่าเพิ่ม | ยอดรวม | รายละเอียดสินค้าหรือบริการ | ระดับความมั่นใจ | ชื่อไฟล์ | เหตุผลกรณีความมั่นใจไม่สูง
```
ห้ามเขียนสรุปนอกตาราง **ยกเว้น** รายการที่ความมั่นใจเป็น "ต่ำ" หรือมีเรื่องที่คนต้องตัดสินใจ (เช่น สงสัยว่าซ้ำ, ไม่แน่ใจผู้ขาย/ผู้ซื้อ) ให้ระบุไว้สั้น ๆ ใต้ตาราง เพราะถ้าซ่อนไว้ในคอลัมน์อย่างเดียวผู้ใช้อาจมองข้าม
### 7. เขียนต่อท้ายไฟล์ Excel
ใช้สคริปต์ `scripts/append_tax_invoices.py` — อย่าเขียนโค้ด openpyxl ขึ้นมาใหม่เอง สคริปต์นี้จัดการเรื่องที่พลาดง่ายไว้แล้ว: หาแถวสุดท้ายที่มีข้อมูลจริง คัดลอกรูปแบบเซลล์จากแถวก่อนหน้า จับคู่คอลัมน์จากชื่อหัวตาราง (ไม่ใช่ลำดับตายตัว) ตรวจซ้ำ และเขียนวันที่ให้ตรงชนิดกับที่ template ใช้อยู่
**กรณีผู้ใช้ไม่ได้แนบไฟล์ Excel** ให้ใช้ template ที่ฝังมากับ skill:
```bash
cd /home/claude/tax-invoice-purchase-ocr
python3 scripts/append_tax_invoices.py \
--template assets/รายงานภาษีซื้อ_template.xlsx \
--rows /home/claude/rows.json \
--output "/mnt/user-data/outputs/รายงานภาษีซื้อ.xlsx"
```
**กรณีผู้ใช้แนบไฟล์ Excel มาเอง** (มักมีข้อมูลสะสมอยู่แล้ว) ให้ใช้ไฟล์นั้นแทน:
```bash
python3 scripts/append_tax_invoices.py \
--template "/mnt/user-data/uploads/รายงานภาษีซื้อ.xlsx" \
--rows /home/claude/rows.json \
--output "/mnt/user-data/outputs/รายงานภาษีซื้อ.xlsx"
```
`rows.json` เป็น list ของ object ที่ใช้ชื่อคีย์ตรงกับชื่อคอลัมน์ภาษาไทย เช่น:
```json
[
{
"วันที่": "05/03/2569",
"เลขที่เอกสาร": "INV-2569-00123",
"เลขประจำตัวผู้เสียภาษี": "0105536000123",
"ชื่อผู้ขาย": "บริษัท เอบีซี เคมิคอล จำกัด",
"มูลค่าสินค้า": 12000.00,
"ภาษีมูลค่าเพิ่ม": 840.00,
"ยอดรวม": 12840.00,
"รายละเอียดสินค้าหรือบริการ": "Sucralose",
"ระดับความมั่นใจ": "สูง",
"ชื่อไฟล์": "INV-2569-00123.pdf",
"เหตุผลกรณีความมั่นใจไม่สูง": "-"
}
]
```
จำนวนเงินต้องเป็นตัวเลข (ไม่ใส่เครื่องหมายคำพูด ไม่มีคอมม่า) เลขผู้เสียภาษีต้องเป็นข้อความเพื่อรักษาเลข 0 นำหน้า
สคริปต์จะพิมพ์สรุปออกมาเป็น JSON บอกว่าเขียนกี่แถว ข้ามกี่แถวเพราะซ้ำ และเจอปัญหาอะไรบ้าง **อ่านสรุปนี้แล้วรายงานให้ผู้ใช้ทราบ** อย่าส่งไฟล์โดยไม่ดูผลลัพธ์ ถ้าสคริปต์เตือนว่าจับคู่คอลัมน์ไม่ครบ แปลว่า template อาจใช้ชื่อหัวตารางต่างจากที่คาด ให้เปิดดูไฟล์แล้วส่ง `--column-map` เพิ่ม (ดู `--help`)
### 8. ส่งไฟล์
บันทึกผลลัพธ์ไว้ที่ `/mnt/user-data/outputs/` แล้วเรียก `present_files` เพื่อให้ผู้ใช้ดาวน์โหลดได้ทันที ไฟล์ที่สร้างแล้วไม่ได้ present ผู้ใช้จะเปิดไม่ได้เลย โดยเฉพาะบนมือถือ
ใช้ **ชื่อไฟล์เดิม** ของ template เพื่อให้ผู้ใช้เอาไปแทนที่ไฟล์เก่าได้ตรง ๆ (สคริปต์ไม่แก้ไฟล์ต้นฉบับ เพราะ `/mnt/user-data/uploads/` เป็น read-only อยู่แล้ว) ถ้าใช้ template ที่ฝังมากับ skill (ไม่มีไฟล์ผู้ใช้ให้อ้างอิงชื่อ) ให้ตั้งชื่อว่า `รายงานภาษีซื้อ.xlsx`
## กติกาป้องกันข้อมูลซ้ำ
สคริปต์เทียบ (เลขที่เอกสาร + ชื่อผู้ขาย) แบบ normalize แล้ว (ตัดช่องว่าง ตัดขีด ไม่สนตัวพิมพ์)
- ถ้าซ้ำกับข้อมูลเดิมในไฟล์ → ข้าม ไม่เขียนซ้ำ และรายงานในสรุป
- ถ้าใกล้เคียงแต่ไม่เหมือนเป๊ะ (เช่น ชื่อผู้ขายสะกดต่างเล็กน้อย) → สคริปต์จะเขียนลงไปแต่ตั้งเหตุผลเป็น "อาจซ้ำกับข้อมูลเดิม ควรตรวจสอบ" ให้ผู้ใช้ตัดสินเอง ดีกว่าตัดทิ้งเงียบ ๆ
## สิ่งที่ห้ามทำ
- ห้ามเดาเลขผู้เสียภาษีให้ครบ 13 หลัก ถ้าอ่านได้ไม่ครบ ให้ใส่เท่าที่อ่านได้ ตามด้วยการลดความมั่นใจเป็น "ต่ำ" และระบุเหตุผล
- ห้ามเติมชื่อผู้ขายจากความรู้ทั่วไป ถ้าอ่านได้แค่ "บริษัท เอ...จำกัด" ก็ใส่เท่านั้น
- ห้ามปรับตัวเลขให้สูตรลงตัว
- ห้ามแก้หัวตาราง เปลี่ยนชื่อคอลัมน์ ลบสูตร หรือเปลี่ยนรูปแบบเดิมในไฟล์ Excel
- ห้ามรายงานว่างานเสร็จโดยยังไม่ได้ present ไฟล์
## เมื่ออ่านไม่ได้จริง ๆ
ถ้าไฟล์ใดเบลอหรือเสียหายจนอ่านข้อมูลหลักไม่ได้ ให้ใส่แถวนั้นในตารางโดยเว้นช่องที่อ่านไม่ได้ ระดับความมั่นใจ "ต่ำ" และเหตุผลที่ตรงกับปัญหา แล้วแจ้งผู้ใช้ใต้ตารางว่าไฟล์ไหนต้องคีย์มือ **อย่าข้ามไฟล์เงียบ ๆ** เพราะผู้ใช้จะนับจำนวนใบไม่ตรงและไม่รู้ว่าหายไปไหน
ตรวจสอบและแทนที่ข้อมูลในวงเล็บก่อนนำไปใช้กับข้อมูลจริง
วิธีใช้งาน
1. ดาวโหลดไฟล์ Skill ไปติดตั้งใน Claude.ai
2. เวลาใช้งานให้พิมพ์เรียก Skill ขึ้นมา และเขียนข้อความสั้นๆ ประมาณ "ช่วย ocr ใบกำกับภาษีใส่ excel ให้หน่อย"
ตัวอย่าง
/tax-invoice-purchase-ocr
ช่วย ocr ใบกำกับภาษีใส่ excel ให้หน่อย
3. จะอัพโหลดไฟล์ Excel template รายงานภาษีซื้อเข้าไปก็ได้ (หรือไม่อัพก็ได้)