protae5544 commited on
Commit
37d1ba0
·
verified ·
1 Parent(s): 29fb885

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +162 -228
app.py CHANGED
@@ -1,285 +1,219 @@
1
  import gradio as gr
2
  import sqlite3
3
- import json
4
  import os
5
  import time
6
  from reportlab.lib.pagesizes import A4
7
  from reportlab.pdfgen import canvas
8
- from reportlab.lib.units import cm
9
  import qrcode
10
- from huggingface_hub import upload_file, hf_hub_download
11
  import requests
12
 
13
  REPO_ID = "protae5544/WorkerManagement"
14
 
15
- # ดาวน์โหลดและโหลดข้อมูล JSON
16
- def load_json_data():
17
- try:
18
- # ลองดาวน์โหลด JSON จาก Space เดิม
19
- json_path = hf_hub_download(
20
- repo_id="protae5544/worberkit2024poe",
21
- filename="worker-database.json",
22
- repo_type="space"
23
- )
24
- with open(json_path, 'r', encoding='utf-8') as f:
25
- data = json.load(f)
26
- print(f"โหลดข้อมูล JSON สำเร็จ: {len(data)} รายการ")
27
- return data
28
- except Exception as e:
29
- print(f"ไม่สามารถโหลด JSON: {e}")
30
- # ข้อมูลตัวอย่างถ้าไม่มี JSON
31
- return [
32
- {
33
- "เลขคำขอ": "WP-68-366-150",
34
- "ชื่อภาษาอังกฤษ": "MR. AUNG KYAW",
35
- "หมายเลขอ้างอิงคนต่างด้าว": "2492102076212",
36
- "หมายเลขประจำตัว": "6685490000472",
37
- "สัญชาติ": "เมียนมา",
38
- "เลขที่บนขวาใบเสร็จ": "2100680001130",
39
- "หมายเลขชำระเงิน": "IV680210/002350"
40
- }
41
- ]
42
-
43
  def setup_fonts():
44
  try:
45
  from reportlab.pdfbase import pdfmetrics
46
  from reportlab.pdfbase.ttfonts import TTFont
47
 
48
  font_url = 'https://fonts.gstatic.com/s/sarabun/v13/DtVjJx26TKEqsc-lWcmw-wKE7wM.ttf'
49
- bold_url = 'https://fonts.gstatic.com/s/sarabun/v13/DtVmJx26TKEqsc-lWcmw5wq0hwOKBwXcb0A.ttf'
50
-
51
- for filename, url in [('THSarabun.ttf', font_url), ('THSarabunBold.ttf', bold_url)]:
52
- if not os.path.exists(filename):
53
- response = requests.get(url, timeout=10)
54
- if response.status_code == 200:
55
- with open(filename, 'wb') as f:
56
- f.write(response.content)
57
- print(f"ดาวน์โหลดฟอนต์: {filename}")
58
 
59
  pdfmetrics.registerFont(TTFont('THSarabun', 'THSarabun.ttf'))
60
- pdfmetrics.registerFont(TTSarabunBold', 'THSarabunBold.ttf'))
61
- print("ลงทะเบียนฟอนต์สำเร็จ")
62
  return True
63
  except Exception as e:
64
- print(f"ไม่สามารถตั้งค่าฟอนต์: {e}")
65
  return False
66
 
67
- def thai_date_time(timestamp):
68
- months = {
69
- 1: "มกราคม", 2: "กุมภาพันธ์", 3: "มีนาคม", 4: "เมษายน",
70
- 5: "พฤษภาคม", 6: "มิถุนายน", 7: "กรกฎาคม", 8: "สิงหาคม",
71
- 9: "กันยายน", 10: "ตุลาคม", 11: "พฤศจิกายน", 12: "ธันวาคม"
72
- }
73
- dt = time.localtime(timestamp)
74
- return f"{dt.tm_mday:02d} {months[dt.tm_mon]} {dt.tm_year + 543} {dt.tm_hour:02d}:{dt.tm_min:02d} น"
 
 
 
 
 
 
 
75
 
76
- def create_receipt_pdf(worker_data):
77
- request_number = worker_data["เลขคำขอ"]
78
  filename = f"receipt_{request_number}.pdf"
79
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
80
  try:
81
- os.makedirs("pdfs", exist_ok=True)
82
-
83
- c = canvas.Canvas(filename, pagesize=A4)
84
- width, height = A4
85
-
86
- font_available = setup_fonts()
87
-
88
- # **หัวเอกสาร - ตำแหน่งเดิมทุกตัว**
89
- if font_available:
90
- c.setFont("THSarabunBold", 18)
91
- else:
92
- c.setFont("Helvetica-Bold", 18)
93
- c.drawString(2*cm, 28*cm, "กระทรวงแรงงาน")
94
-
95
- if font_available:
96
- c.setFont("THSarabun", 14)
97
- else:
98
- c.setFont("Helvetica", 12)
99
- c.drawString(2*cm, 27.5*cm, "ใบเสร็จรับเงิน (ต้นฉบับ)")
100
- c.drawString(2*cm, 26*cm, f"เลขที่: {worker_data['เลขที่บนขวาใบเสร็จ']}")
101
- c.drawString(2*cm, 25.5*cm, "ที่ทำการ: สำนักบริหารแรงงานต่างด้าว")
102
- c.drawString(2*cm, 25*cm, "วันที่: 01 เมษายน 2568")
103
- c.drawString(2*cm, 24.5*cm, f"เลขที่ใบชำระเงิน: {worker_data['หมายเลขชำระเงิน']}")
104
- c.drawString(2*cm, 24*cm, f"เลขรับคำขอที่: {worker_data['เลขคำขอ']}")
105
- c.drawString(2*cm, 23.5*cm, f"ชื่อผู้ชำระเงิน: {worker_data['ชื่อภาษาอังกฤษ']}")
106
- c.drawString(2*cm, 23*cm, f"สัญชาติ: {worker_data['สัญชาติ']}")
107
- c.drawString(2*cm, 22.5*cm, f"เลขอ้างอิงคนต่างด้าว: {worker_data['หมายเลขอ้างอิงคนต่างด้าว']}")
108
- c.drawString(2*cm, 22*cm, f"หมายเลขประจำตัวคนต่างด้าว: {worker_data['หมายเลขประจำตัว']}")
109
- c.drawString(2*cm, 21.5*cm, "ชื่อนายจ้าง / สถานประกอบการ: บริษัท บาน กง เอ็นจิเนียริ่ง จำกัด")
110
- c.drawString(2*cm, 21*cm, "เลขประจำตัวนายจ้าง: 0415567000061")
111
-
112
- # **รายการ - เดิมทุกบรรทัด**
113
- if font_available:
114
- c.setFont("THSarabunBold", 14)
115
- else:
116
- c.setFont("Helvetica-Bold", 12)
117
- c.drawString(2*cm, 20*cm, "รายการ")
118
-
119
- if font_available:
120
- c.setFont("THSarabun", 12)
121
- else:
122
- c.setFont("Helvetica", 12)
123
- c.drawString(2*cm, 19.5*cm, "1. ค่าธรรมเนียมในการยื่นคำขอ ฉบับละ 100 บาท: 100.00")
124
- c.drawString(2*cm, 19*cm, "2. ค่าธรรมเนียม: 900.00")
125
- c.drawString(2*cm, 18.5*cm, "รวมเป็นเงินทั้งสิ้น (บาท): (หนึ่งพันบาทถ้วน) 1,000.00")
126
- c.drawString(2*cm, 18*cm, "ได้รับเงินไว้เป็นการถูกต้องแล้ว")
127
- c.drawString(2*cm, 17.5*cm, "(ลงชื่อ) นางสาวอารีวรรณ โพธิ์นิ่มแดง (ผู้รับเงิน)")
128
- c.drawString(2*cm, 17*cm, "ตำแหน่ง: นักวิชาการแรงงานชำนาญการ")
129
-
130
- # **QR Code - ตำแหน่งเดิม**
131
- pdf_url = f"https://huggingface.co/spaces/{REPO_ID}/resolve/main/{filename}"
132
- try:
133
- qr = qrcode.make(pdf_url)
134
- qr.save("temp_qr.png")
135
- c.drawImage("temp_qr.png", 15*cm, 15*cm, width=3*cm, height=3*cm)
136
- except Exception as e:
137
- print(f"ไม่สามารถสร้าง QR Code: {e}")
138
-
139
- # **เวลาพิมพ์ - ตำแหน่งเดิม**
140
- c.setFont("Helvetica", 8)
141
- print_time = thai_date_time(time.time())
142
- c.drawString(2*cm, 2*cm, f"พิมพ์เมื่อ: {print_time}")
143
-
144
- c.showPage()
145
- c.save()
146
-
147
- # **อัพโหลดไฟล์**
148
  upload_file(
149
  path_or_fileobj=filename,
150
  path_in_repo=filename,
151
  repo_id=REPO_ID,
152
  repo_type="space"
153
  )
154
-
155
- print(f"✅ สร้าง PDF สำเร็จ: {filename}")
156
  return pdf_url
157
-
158
  except Exception as e:
159
- print(f" ข้อผิดพลาดในการสร้าง PDF: {e}")
160
  return None
161
 
162
- # โหลดข้อมูล JSON
163
- json_data = load_json_data()
164
-
165
- def get_worker_names():
166
- """ดึงรายชื่อพนักงานสำหรับ dropdown"""
167
- names = []
168
- for worker in json_data:
169
- name_display = f"{worker['ชื่อภาษาอังกฤษ']} ({worker['เลขคำขอ']})"
170
- names.append(name_display)
171
- return names
172
-
173
- def get_worker_by_selection(selected_name):
174
- """ดึงข้อมูลพนักงานจากการเลือก"""
175
- if not selected_name:
176
- return "", "", "", "", "", ""
177
 
178
- # แยกเลขคำขอจากชื่อที่เลือก
179
- request_number = selected_name.split("(")[-1].replace(")", "")
180
 
181
- for worker in json_data:
182
- if worker['เลขคำขอ'] == request_number:
183
- return (
184
- worker['ชื่อภาษาอังกฤษ'],
185
- worker['หมายเลขอ้างอิงคนต่างด้าว'],
186
- worker['หมายเลขประจำตัว'],
187
- worker['สัญชาติ'],
188
- worker['เลขที่บนขวาใบเสร็จ'],
189
- worker['หมายเลขชำระเงิน']
190
- )
191
 
192
- return "", "", "", "", "", ""
193
-
194
- def generate_pdf_from_selection(selected_name):
195
- """สร้าง PDF จากการเลือกพนักงาน"""
196
- if not selected_name:
197
- return "❌ กรุณาเลือกพนักงาน"
 
 
 
 
198
 
199
- request_number = selected_name.split("(")[-1].replace(")", "")
 
 
200
 
201
- for worker in json_data:
202
- if worker['เลขคำขอ'] == request_number:
203
- pdf_url = create_receipt_pdf(worker)
204
- if pdf_url:
205
- return f"""✅ สร้างใบเสร็จสำเร็จ!
206
 
207
- 📋 เลขคำขอ: {worker['เลขคำขอ']}
208
- 👤 ชื่อ: {worker['ชื่อภาษาอังกฤษ']}
209
- 🆔 หมายเลขประจำตัว: {worker['หมายเลขประจำตัว']}
210
 
211
  📄 ดาวน์โหลด PDF: {pdf_url}
212
 
213
- หน้าตาใบเสร็จเหมือนเดิม 100%
214
- 📱 สแกน QR Code ในใบเสร็จเพื่อดาวน์โหลด"""
215
- else:
216
- return "❌ เกิดข้อผิดพลาดในการสร้าง PDF"
217
-
218
- return "❌ ไม่พบข้อมูลพนักงาน"
 
219
 
220
- def show_all_workers():
221
- """แสดงรายการพนักงานทั้งหมดจาก JSON"""
222
- if not json_data:
223
- return "ไม่มีข้อมูลพนักงาน"
 
 
 
 
 
224
 
225
- result = f"📊 รายการพนักงานจากฐานข้อมูล ({len(json_data)} คน)\n\n"
226
- for i, worker in enumerate(json_data, 1):
227
- result += f"{i}. {worker['เลขคำขอ']} | {worker['ชื่อภาษาอังกฤษ']} | {worker['สัญชาติ']} | {worker['หมายเลขประจำตัว']}\n"
228
 
229
- return result
 
 
 
230
 
231
  # สร้าง UI
232
- with gr.Blocks(title="ระบบจัดการพนักงาน - เหมือนเดิม") as app:
233
  gr.Markdown("# 🏢 ระบบจัดการข้อมูลพนักงานต่างด้าว")
234
  gr.Markdown("### บริษัท บาน กง เอ็นจิเนียริ่ง จำกัด")
235
- gr.Markdown("#### ✅ ดึงข้อมูลจาก JSON อัตโนมัติ | หน้าตาเอกสารเหมือนเดิม 100%")
236
-
237
- with gr.Tab("📝 สร้างใบเสร็จจาก JSON"):
238
- gr.Markdown("### เลือกพนักงานจากฐานข้อมูล")
239
-
240
- worker_dropdown = gr.Dropdown(
241
- choices=get_worker_names(),
242
- label="🔍 เลือกพนักงาน",
243
- interactive=True
244
- )
245
-
246
- gr.Markdown("**ข้อมูลที่เลือก:**")
247
- with gr.Row():
248
- name_display = gr.Textbox(label="ชื่อภาษาอังกฤษ", interactive=False)
249
- ref_display = gr.Textbox(label="หมายเลขอ้างอิง", interactive=False)
250
-
251
- with gr.Row():
252
- id_display = gr.Textbox(label="หมายเลขประจำตัว", interactive=False)
253
- nation_display = gr.Textbox(label="สัญชาติ", interactive=False)
254
-
255
- with gr.Row():
256
- receipt_display = gr.Textbox(label="เลขที่ใบเสร็จ", interactive=False)
257
- payment_display = gr.Textbox(label="หมายเลขชำระเงิน", interactive=False)
258
-
259
- generate_btn = gr.Button("🎯 สร้างใบเสร็จ (เหมือนเดิม 100%)", variant="primary", size="lg")
260
- result_output = gr.Textbox(label="ผลลัพธ์", lines=10, interactive=False)
261
-
262
- with gr.Tab("📋 ดูข้อมูลทั้งหมด"):
263
- show_all_btn = gr.Button("👥 แสดงข้อมูลจาก JSON")
264
- all_workers_output = gr.Textbox(label="รายการพนักงานทั้งหมด", lines=20, interactive=False)
265
 
266
- # เชื่อมต่อ Events
267
- worker_dropdown.change(
268
- fn=get_worker_by_selection,
269
- inputs=[worker_dropdown],
270
- outputs=[name_display, ref_display, id_display, nation_display, receipt_display, payment_display]
271
- )
 
 
 
 
 
 
 
272
 
273
- generate_btn.click(
274
- fn=generate_pdf_from_selection,
275
- inputs=[worker_dropdown],
276
- outputs=[result_output]
277
- )
278
 
279
- show_all_btn.click(
280
- fn=show_all_workers,
281
- outputs=[all_workers_output]
282
- )
283
 
284
- print("🚀 เริ่มต้นระบบ...")
285
- app.launch(server_name="0.0.0.0", server_port=7860)
 
1
  import gradio as gr
2
  import sqlite3
 
3
  import os
4
  import time
5
  from reportlab.lib.pagesizes import A4
6
  from reportlab.pdfgen import canvas
 
7
  import qrcode
8
+ from huggingface_hub import upload_file
9
  import requests
10
 
11
  REPO_ID = "protae5544/WorkerManagement"
12
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
  def setup_fonts():
14
  try:
15
  from reportlab.pdfbase import pdfmetrics
16
  from reportlab.pdfbase.ttfonts import TTFont
17
 
18
  font_url = 'https://fonts.gstatic.com/s/sarabun/v13/DtVjJx26TKEqsc-lWcmw-wKE7wM.ttf'
19
+ if not os.path.exists('THSarabun.ttf'):
20
+ response = requests.get(font_url, timeout=10)
21
+ with open('THSarabun.ttf', 'wb') as f:
22
+ f.write(response.content)
 
 
 
 
 
23
 
24
  pdfmetrics.registerFont(TTFont('THSarabun', 'THSarabun.ttf'))
 
 
25
  return True
26
  except Exception as e:
27
+ print(f"Font error: {e}")
28
  return False
29
 
30
+ def init_db():
31
+ conn = sqlite3.connect("workers.db")
32
+ c = conn.cursor()
33
+ c.execute('''CREATE TABLE IF NOT EXISTS workers (
34
+ request_number TEXT PRIMARY KEY,
35
+ english_name TEXT,
36
+ foreign_reference_number TEXT,
37
+ id_number TEXT,
38
+ nationality TEXT,
39
+ receipt_number TEXT,
40
+ payment_number TEXT,
41
+ created_at TEXT
42
+ )''')
43
+ conn.commit()
44
+ conn.close()
45
 
46
+ def create_pdf(request_number, english_name, foreign_reference_number, id_number, nationality, receipt_number, payment_number):
 
47
  filename = f"receipt_{request_number}.pdf"
48
 
49
+ c = canvas.Canvas(filename, pagesize=A4)
50
+ width, height = A4
51
+
52
+ font_available = setup_fonts()
53
+
54
+ if font_available:
55
+ c.setFont("THSarabun", 18)
56
+ else:
57
+ c.setFont("Helvetica-Bold", 16)
58
+
59
+ # หัวเอกสาร
60
+ c.drawCentredText(width/2, height-60, "กระทรวงแรงงาน")
61
+ c.drawCentredText(width/2, height-85, "ใบเสร็จรับเงิน (ต้นฉบับ)")
62
+
63
+ # ข้อมูลหลัก
64
+ y = height - 130
65
+ c.setFont("Helvetica", 12)
66
+
67
+ info_lines = [
68
+ f"เลขที่: {receipt_number}",
69
+ "ที่ทำการ: สำนักบริหารแรงงานต่างด้าว",
70
+ "วันที่: 01 เมษายน 2568",
71
+ f"เลขที่ใบชำระเงิน: {payment_number}",
72
+ f"เลขรับคำขอที่: {request_number}",
73
+ "",
74
+ f"ชื่อผู้ชำระเงิน: {english_name}",
75
+ f"สัญชาติ: {nationality}",
76
+ f"เลขอ้างอิงคนต่างด้าว: {foreign_reference_number}",
77
+ f"หมายเลขประจำตัวคนต่างด้าว: {id_number}",
78
+ "",
79
+ "ชื่อนายจ้าง: บริษัท บาน กง เอ็นจิเนียริ่ง จำกัด",
80
+ "เลขประจำตัวนายจ้าง: 0415567000061",
81
+ "",
82
+ "รายการค่าธรรมเนียม:",
83
+ "1. ค่าธรรมเนียมในการยื่นคำขอ ฉบับละ 100 บาท: 100.00",
84
+ "2. ค่าธรรมเนียมการพิจารณา: 900.00",
85
+ "รวมเป็นเงินทั้งสิ้น (บาท): (หนึ่งพันบาทถ้วน) 1,000.00",
86
+ "",
87
+ "ได้รับเงินไว้เป็นการถูกต้องแล้ว",
88
+ "",
89
+ "(ลงชื่อ) นางสาวอารีวรรณ โพธิ์นิ่มแดง (ผู้รับเงิน)",
90
+ "ตำแหน่ง: นักวิชาการแรงงานชำนาญการ"
91
+ ]
92
+
93
+ for line in info_lines:
94
+ c.drawString(50, y, line)
95
+ y -= 20
96
+
97
+ # QR Code
98
+ pdf_url = f"https://huggingface.co/spaces/{REPO_ID}/resolve/main/{filename}"
99
+ try:
100
+ qr = qrcode.make(pdf_url)
101
+ qr.save("temp_qr.png")
102
+ c.drawImage("temp_qr.png", width-120, 50, width=70, height=70)
103
+ except Exception as e:
104
+ print(f"QR error: {e}")
105
+
106
+ # เวลาที่พิมพ์
107
+ c.setFont("Helvetica", 8)
108
+ current_time = time.strftime('%d/%m/%Y %H:%M:%S')
109
+ c.drawString(50, 30, f"พิมพ์เมื่อ: {current_time}")
110
+
111
+ c.save()
112
+
113
+ # อัพโหลดไฟล์
114
  try:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
115
  upload_file(
116
  path_or_fileobj=filename,
117
  path_in_repo=filename,
118
  repo_id=REPO_ID,
119
  repo_type="space"
120
  )
 
 
121
  return pdf_url
 
122
  except Exception as e:
123
+ print(f"Upload error: {e}")
124
  return None
125
 
126
+ def add_worker(english_name, foreign_reference_number, id_number, nationality, receipt_number, payment_number):
127
+ # ตรวจสอบข้อมูล
128
+ if not all([english_name, foreign_reference_number, id_number, nationality, receipt_number, payment_number]):
129
+ return "❌ กรุณากรอกข้อมูลให้ครบทุกช่อง"
 
 
 
 
 
 
 
 
 
 
 
130
 
131
+ if not id_number.isdigit() or len(id_number) != 13:
132
+ return " หมายเลขประจำตัวต้องเป็นตัวเลข 13 หลักเท่านั้น"
133
 
134
+ # สร้างเลขคำขอ
135
+ conn = sqlite3.connect("workers.db")
136
+ c = conn.cursor()
137
+ c.execute("SELECT COUNT(*) FROM workers")
138
+ count = c.fetchone()[0]
139
+ conn.close()
 
 
 
 
140
 
141
+ request_number = f"WP-68-366-{150 + count:03d}"
142
+
143
+ # บันทึกข้อมูล
144
+ conn = sqlite3.connect("workers.db")
145
+ c = conn.cursor()
146
+ c.execute('''INSERT INTO workers VALUES (?, ?, ?, ?, ?, ?, ?, ?)''',
147
+ (request_number, english_name, foreign_reference_number, id_number,
148
+ nationality, receipt_number, payment_number, str(time.time())))
149
+ conn.commit()
150
+ conn.close()
151
 
152
+ # สร้าง PDF
153
+ pdf_url = create_pdf(request_number, english_name, foreign_reference_number,
154
+ id_number, nationality, receipt_number, payment_number)
155
 
156
+ if pdf_url:
157
+ result_text = f"""✅ เสร็จสิ้น!
 
 
 
158
 
159
+ 📋 เลขคำขอ: {request_number}
160
+ 👤 ชื่อ: {english_name}
161
+ 🆔 หมายเลขประจำตัว: {id_number}
162
 
163
  📄 ดาวน์โหลด PDF: {pdf_url}
164
 
165
+ 🔍 วิธีใช้:
166
+ 1. คลิกลิงก์ด้านบนเพื่อดาวน์โหลด PDF
167
+ 2. สแกน QR Code ในใบเสร็จเพื่อดาวน์โหลดอีกครั้ง
168
+ 3. ใบเสร็จพร้อมใช้งาน!"""
169
+ return result_text
170
+ else:
171
+ return "❌ เกิดข้อผิดพลาดในการสร้าง PDF"
172
 
173
+ def view_all():
174
+ conn = sqlite3.connect("workers.db")
175
+ c = conn.cursor()
176
+ c.execute("SELECT request_number, english_name, nationality, id_number FROM workers ORDER BY request_number DESC")
177
+ workers = c.fetchall()
178
+ conn.close()
179
+
180
+ if not workers:
181
+ return "ยังไม่มีข้อมูลพนักงานในระบบ"
182
 
183
+ result_text = f"📊 รายการพนักงานทั้งหมด ({len(workers)} คน)\n\n"
184
+ for i, worker in enumerate(workers, 1):
185
+ result_text += f"{i}. {worker[0]} | {worker[1]} | {worker[2]} | {worker[3]}\n"
186
 
187
+ return result_text
188
+
189
+ # เริ่มต้นระบบ
190
+ init_db()
191
 
192
  # สร้าง UI
193
+ with gr.Blocks(title="ระบบจัดการพนักงาน") as app:
194
  gr.Markdown("# 🏢 ระบบจัดการข้อมูลพนักงานต่างด้าว")
195
  gr.Markdown("### บริษัท บาน กง เอ็นจิเนียริ่ง จำกัด")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
196
 
197
+ with gr.Tab("📝 เพิ่มพนักงานใหม่"):
198
+ gr.Markdown("### กรอกข้อมูลพนักงาน")
199
+
200
+ name = gr.Textbox(label="ชื่อภาษาอังกฤษ", placeholder="MR. AUNG KYAW")
201
+ ref_num = gr.Textbox(label="หมายเลขอ้างอิงคนต่างด้าว", placeholder="2492102076212")
202
+ id_num = gr.Textbox(label="หมายเลขประจำตัว (13 หลัก)", placeholder="6685490000472")
203
+ nation = gr.Dropdown(["เมียนมา", "กัมพูชา", "ลาว", "เวียดนาม"],
204
+ label="สัญชาติ", value="เมียนมา")
205
+ receipt = gr.Textbox(label="เลขที่ใบเสร็จ", placeholder="2100680001130")
206
+ payment = gr.Textbox(label="หมายเลขชำระเงิน", placeholder="IV680210/002350")
207
+
208
+ submit = gr.Button("💾 สร้างใบเสร็จ", variant="primary", size="lg")
209
+ result = gr.Textbox(label="ผลลัพธ์", lines=8, interactive=False)
210
 
211
+ with gr.Tab("📋 ดูรายการ"):
212
+ view_btn = gr.Button("👥 ดูรายการพนักงานทั้งหมด")
213
+ worker_list = gr.Textbox(label="รายการ", lines=15, interactive=False)
 
 
214
 
215
+ # เชื่อมต่อฟังก์ชัน
216
+ submit.click(add_worker, [name, ref_num, id_num, nation, receipt, payment], result)
217
+ view_btn.click(view_all, outputs=worker_list)
 
218
 
219
+ app.launch()