Spaces:
Runtime error
Runtime error
import gradio as gr | |
import sqlite3 | |
import json | |
import os | |
import time | |
from reportlab.lib.pagesizes import A4 | |
from reportlab.pdfgen import canvas | |
from reportlab.lib.units import cm | |
import qrcode | |
from huggingface_hub import upload_file, hf_hub_download | |
import requests | |
REPO_ID = "protae5544/WorkerManagement" | |
# ดาวน์โหลดและโหลดข้อมูล JSON | |
def load_json_data(): | |
try: | |
# ลองดาวน์โหลด JSON จาก Space เดิม | |
json_path = hf_hub_download( | |
repo_id="protae5544/worberkit2024poe", | |
filename="worker-database.json", | |
repo_type="space" | |
) | |
with open(json_path, 'r', encoding='utf-8') as f: | |
data = json.load(f) | |
print(f"โหลดข้อมูล JSON สำเร็จ: {len(data)} รายการ") | |
return data | |
except Exception as e: | |
print(f"ไม่สามารถโหลด JSON: {e}") | |
# ข้อมูลตัวอย่างถ้าไม่มี JSON | |
return [ | |
{ | |
"เลขคำขอ": "WP-68-366-150", | |
"ชื่อภาษาอังกฤษ": "MR. AUNG KYAW", | |
"หมายเลขอ้างอิงคนต่างด้าว": "2492102076212", | |
"หมายเลขประจำตัว": "6685490000472", | |
"สัญชาติ": "เมียนมา", | |
"เลขที่บนขวาใบเสร็จ": "2100680001130", | |
"หมายเลขชำระเงิน": "IV680210/002350" | |
} | |
] | |
def setup_fonts(): | |
try: | |
from reportlab.pdfbase import pdfmetrics | |
from reportlab.pdfbase.ttfonts import TTFont | |
font_url = 'https://fonts.gstatic.com/s/sarabun/v13/DtVjJx26TKEqsc-lWcmw-wKE7wM.ttf' | |
bold_url = 'https://fonts.gstatic.com/s/sarabun/v13/DtVmJx26TKEqsc-lWcmw5wq0hwOKBwXcb0A.ttf' | |
for filename, url in [('THSarabun.ttf', font_url), ('THSarabunBold.ttf', bold_url)]: | |
if not os.path.exists(filename): | |
response = requests.get(url, timeout=10) | |
if response.status_code == 200: | |
with open(filename, 'wb') as f: | |
f.write(response.content) | |
print(f"ดาวน์โหลดฟอนต์: {filename}") | |
pdfmetrics.registerFont(TTFont('THSarabun', 'THSarabun.ttf')) | |
pdfmetrics.registerFont(TTSarabunBold', 'THSarabunBold.ttf')) | |
print("ลงทะเบียนฟอนต์สำเร็จ") | |
return True | |
except Exception as e: | |
print(f"ไม่สามารถตั้งค่าฟอนต์: {e}") | |
return False | |
def thai_date_time(timestamp): | |
months = { | |
1: "มกราคม", 2: "กุมภาพันธ์", 3: "มีนาคม", 4: "เมษายน", | |
5: "พฤษภาคม", 6: "มิถุนายน", 7: "กรกฎาคม", 8: "สิงหาคม", | |
9: "กันยายน", 10: "ตุลาคม", 11: "พฤศจิกายน", 12: "ธันวาคม" | |
} | |
dt = time.localtime(timestamp) | |
return f"{dt.tm_mday:02d} {months[dt.tm_mon]} {dt.tm_year + 543} {dt.tm_hour:02d}:{dt.tm_min:02d} น" | |
def create_receipt_pdf(worker_data): | |
request_number = worker_data["เลขคำขอ"] | |
filename = f"receipt_{request_number}.pdf" | |
try: | |
os.makedirs("pdfs", exist_ok=True) | |
c = canvas.Canvas(filename, pagesize=A4) | |
width, height = A4 | |
font_available = setup_fonts() | |
# **หัวเอกสาร - ตำแหน่งเดิมทุกตัว** | |
if font_available: | |
c.setFont("THSarabunBold", 18) | |
else: | |
c.setFont("Helvetica-Bold", 18) | |
c.drawString(2*cm, 28*cm, "กระทรวงแรงงาน") | |
if font_available: | |
c.setFont("THSarabun", 14) | |
else: | |
c.setFont("Helvetica", 12) | |
c.drawString(2*cm, 27.5*cm, "ใบเสร็จรับเงิน (ต้นฉบับ)") | |
c.drawString(2*cm, 26*cm, f"เลขที่: {worker_data['เลขที่บนขวาใบเสร็จ']}") | |
c.drawString(2*cm, 25.5*cm, "ที่ทำการ: สำนักบริหารแรงงานต่างด้าว") | |
c.drawString(2*cm, 25*cm, "วันที่: 01 เมษายน 2568") | |
c.drawString(2*cm, 24.5*cm, f"เลขที่ใบชำระเงิน: {worker_data['หมายเลขชำระเงิน']}") | |
c.drawString(2*cm, 24*cm, f"เลขรับคำขอที่: {worker_data['เลขคำขอ']}") | |
c.drawString(2*cm, 23.5*cm, f"ชื่อผู้ชำระเงิน: {worker_data['ชื่อภาษาอังกฤษ']}") | |
c.drawString(2*cm, 23*cm, f"สัญชาติ: {worker_data['สัญชาติ']}") | |
c.drawString(2*cm, 22.5*cm, f"เลขอ้างอิงคนต่างด้าว: {worker_data['หมายเลขอ้างอิงคนต่างด้าว']}") | |
c.drawString(2*cm, 22*cm, f"หมายเลขประจำตัวคนต่างด้าว: {worker_data['หมายเลขประจำตัว']}") | |
c.drawString(2*cm, 21.5*cm, "ชื่อนายจ้าง / สถานประกอบการ: บริษัท บาน กง เอ็นจิเนียริ่ง จำกัด") | |
c.drawString(2*cm, 21*cm, "เลขประจำตัวนายจ้าง: 0415567000061") | |
# **รายการ - เดิมทุกบรรทัด** | |
if font_available: | |
c.setFont("THSarabunBold", 14) | |
else: | |
c.setFont("Helvetica-Bold", 12) | |
c.drawString(2*cm, 20*cm, "รายการ") | |
if font_available: | |
c.setFont("THSarabun", 12) | |
else: | |
c.setFont("Helvetica", 12) | |
c.drawString(2*cm, 19.5*cm, "1. ค่าธรรมเนียมในการยื่นคำขอ ฉบับละ 100 บาท: 100.00") | |
c.drawString(2*cm, 19*cm, "2. ค่าธรรมเนียม: 900.00") | |
c.drawString(2*cm, 18.5*cm, "รวมเป็นเงินทั้งสิ้น (บาท): (หนึ่งพันบาทถ้วน) 1,000.00") | |
c.drawString(2*cm, 18*cm, "ได้รับเงินไว้เป็นการถูกต้องแล้ว") | |
c.drawString(2*cm, 17.5*cm, "(ลงชื่อ) นางสาวอารีวรรณ โพธิ์นิ่มแดง (ผู้รับเงิน)") | |
c.drawString(2*cm, 17*cm, "ตำแหน่ง: นักวิชาการแรงงานชำนาญการ") | |
# **QR Code - ตำแหน่งเดิม** | |
pdf_url = f"https://huggingface.co/spaces/{REPO_ID}/resolve/main/{filename}" | |
try: | |
qr = qrcode.make(pdf_url) | |
qr.save("temp_qr.png") | |
c.drawImage("temp_qr.png", 15*cm, 15*cm, width=3*cm, height=3*cm) | |
except Exception as e: | |
print(f"ไม่สามารถสร้าง QR Code: {e}") | |
# **เวลาพิมพ์ - ตำแหน่งเดิม** | |
c.setFont("Helvetica", 8) | |
print_time = thai_date_time(time.time()) | |
c.drawString(2*cm, 2*cm, f"พิมพ์เมื่อ: {print_time}") | |
c.showPage() | |
c.save() | |
# **อัพโหลดไฟล์** | |
upload_file( | |
path_or_fileobj=filename, | |
path_in_repo=filename, | |
repo_id=REPO_ID, | |
repo_type="space" | |
) | |
print(f"✅ สร้าง PDF สำเร็จ: {filename}") | |
return pdf_url | |
except Exception as e: | |
print(f"❌ ข้อผิดพลาดในการสร้าง PDF: {e}") | |
return None | |
# โหลดข้อมูล JSON | |
json_data = load_json_data() | |
def get_worker_names(): | |
"""ดึงรายชื่อพนักงานสำหรับ dropdown""" | |
names = [] | |
for worker in json_data: | |
name_display = f"{worker['ชื่อภาษาอังกฤษ']} ({worker['เลขคำขอ']})" | |
names.append(name_display) | |
return names | |
def get_worker_by_selection(selected_name): | |
"""ดึงข้อมูลพนักงานจากการเลือก""" | |
if not selected_name: | |
return "", "", "", "", "", "" | |
# แยกเลขคำขอจากชื่อที่เลือก | |
request_number = selected_name.split("(")[-1].replace(")", "") | |
for worker in json_data: | |
if worker['เลขคำขอ'] == request_number: | |
return ( | |
worker['ชื่อภาษาอังกฤษ'], | |
worker['หมายเลขอ้างอิงคนต่างด้าว'], | |
worker['หมายเลขประจำตัว'], | |
worker['สัญชาติ'], | |
worker['เลขที่บนขวาใบเสร็จ'], | |
worker['หมายเลขชำระเงิน'] | |
) | |
return "", "", "", "", "", "" | |
def generate_pdf_from_selection(selected_name): | |
"""สร้าง PDF จากการเลือกพนักงาน""" | |
if not selected_name: | |
return "❌ กรุณาเลือกพนักงาน" | |
request_number = selected_name.split("(")[-1].replace(")", "") | |
for worker in json_data: | |
if worker['เลขคำขอ'] == request_number: | |
pdf_url = create_receipt_pdf(worker) | |
if pdf_url: | |
return f"""✅ สร้างใบเสร็จสำเร็จ! | |
📋 เลขคำขอ: {worker['เลขคำขอ']} | |
👤 ชื่อ: {worker['ชื่อภาษาอังกฤษ']} | |
🆔 หมายเลขประจำตัว: {worker['หมายเลขประจำตัว']} | |
📄 ดาวน์โหลด PDF: {pdf_url} | |
✅ หน้าตาใบเสร็จเหมือนเดิม 100% | |
📱 สแกน QR Code ในใบเสร็จเพื่อดาวน์โหลด""" | |
else: | |
return "❌ เกิดข้อผิดพลาดในการสร้าง PDF" | |
return "❌ ไม่พบข้อมูลพนักงาน" | |
def show_all_workers(): | |
"""แสดงรายการพนักงานทั้งหมดจาก JSON""" | |
if not json_data: | |
return "ไม่มีข้อมูลพนักงาน" | |
result = f"📊 รายการพนักงานจากฐานข้อมูล ({len(json_data)} คน)\n\n" | |
for i, worker in enumerate(json_data, 1): | |
result += f"{i}. {worker['เลขคำขอ']} | {worker['ชื่อภาษาอังกฤษ']} | {worker['สัญชาติ']} | {worker['หมายเลขประจำตัว']}\n" | |
return result | |
# สร้าง UI | |
with gr.Blocks(title="ระบบจัดการพนักงาน - เหมือนเดิม") as app: | |
gr.Markdown("# 🏢 ระบบจัดการข้อมูลพนักงานต่างด้าว") | |
gr.Markdown("### บริษัท บาน กง เอ็นจิเนียริ่ง จำกัด") | |
gr.Markdown("#### ✅ ดึงข้อมูลจาก JSON อัตโนมัติ | หน้าตาเอกสารเหมือนเดิม 100%") | |
with gr.Tab("📝 สร้างใบเสร็จจาก JSON"): | |
gr.Markdown("### เลือกพนักงานจากฐานข้อมูล") | |
worker_dropdown = gr.Dropdown( | |
choices=get_worker_names(), | |
label="🔍 เลือกพนักงาน", | |
interactive=True | |
) | |
gr.Markdown("**ข้อมูลที่เลือก:**") | |
with gr.Row(): | |
name_display = gr.Textbox(label="ชื่อภาษาอังกฤษ", interactive=False) | |
ref_display = gr.Textbox(label="หมายเลขอ้างอิง", interactive=False) | |
with gr.Row(): | |
id_display = gr.Textbox(label="หมายเลขประจำตัว", interactive=False) | |
nation_display = gr.Textbox(label="สัญชาติ", interactive=False) | |
with gr.Row(): | |
receipt_display = gr.Textbox(label="เลขที่ใบเสร็จ", interactive=False) | |
payment_display = gr.Textbox(label="หมายเลขชำระเงิน", interactive=False) | |
generate_btn = gr.Button("🎯 สร้างใบเสร็จ (เหมือนเดิม 100%)", variant="primary", size="lg") | |
result_output = gr.Textbox(label="ผลลัพธ์", lines=10, interactive=False) | |
with gr.Tab("📋 ดูข้อมูลทั้งหมด"): | |
show_all_btn = gr.Button("👥 แสดงข้อมูลจาก JSON") | |
all_workers_output = gr.Textbox(label="รายการพนักงานทั้งหมด", lines=20, interactive=False) | |
# เชื่อมต่อ Events | |
worker_dropdown.change( | |
fn=get_worker_by_selection, | |
inputs=[worker_dropdown], | |
outputs=[name_display, ref_display, id_display, nation_display, receipt_display, payment_display] | |
) | |
generate_btn.click( | |
fn=generate_pdf_from_selection, | |
inputs=[worker_dropdown], | |
outputs=[result_output] | |
) | |
show_all_btn.click( | |
fn=show_all_workers, | |
outputs=[all_workers_output] | |
) | |
print("🚀 เริ่มต้นระบบ...") | |
app.launch(server_name="0.0.0.0", server_port=7860) |