protae5544 commited on
Commit
57832e8
·
verified ·
1 Parent(s): abf4857

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +70 -333
app.py CHANGED
@@ -4,7 +4,6 @@ import json
4
  import platform
5
  from huggingface_hub import hf_hub_download, upload_file
6
  import os
7
- from pathlib import Path
8
  from reportlab.lib.pagesizes import A4
9
  from reportlab.lib.units import cm
10
  from reportlab.pdfgen import canvas
@@ -15,12 +14,16 @@ import zipfile
15
  import io
16
  from dotenv import load_dotenv
17
  import time
18
- import shutil
19
 
20
- # อ่าน .env
 
 
 
 
21
  load_dotenv()
22
  REPO_ID = os.getenv("REPO_ID", "protae5544/WorkerManagement")
23
- ORIGINAL_REPO_ID = os.getenv("ORIGINAL_REPO_ID", None)
24
 
25
  # ตั้งค่าฟอนต์
26
  try:
@@ -28,363 +31,97 @@ try:
28
  font_path = "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf"
29
  if os.path.exists(font_path):
30
  pdfmetrics.registerFont(TTFont('THSarabunBold', font_path))
31
- else:
32
- # ใช้ฟอนต์ default
33
- print("ใช้ฟอนต์มาตรฐานของ ReportLab เนื่องจากไม่พบ DejaVuSans-Bold")
34
  else:
35
- # ใช้ฟอนต์สำหรับ Windows/Mac
36
  pdfmetrics.registerFont(TTFont('THSarabunBold', 'THSarabunNew-Bold.ttf'))
37
  except Exception as e:
38
- print(f"ใช้ฟอนต์ default เนื่องจากเกิดข้อผิดพลาด: {e}")
39
 
40
- # ฟังก์ชันแปลงวันที่เป็นภาษาไทย
41
- def thai_date_time(timestamp):
42
- months = {
43
- 1: "มกราคม", 2: "กุมภาพันธ์", 3: "มีนาคม", 4: "เมษายน",
44
- 5: "พฤษภาคม", 6: "มิถุนายน", 7: "กรกฎาคม", 8: "สิงหาคม",
45
- 9: "กันยายน", 10: "ตุลาคม", 11: "พฤศจิกายน", 12: "ธันวาคม"
46
- }
47
  dt = time.localtime(timestamp)
48
- day = dt.tm_mday
49
- month = months[dt.tm_mon]
50
- year = dt.tm_year + 543
51
- hour = dt.tm_hour
52
- minute = dt.tm_min
53
- period = "น"
54
- return f"{day:02d} {month} {year} {hour:02d}:{minute:02d} {period}"
55
 
56
- # เริ่มต้นฐานข้อมูล
57
  def init_db():
58
- conn = sqlite3.connect("workers.db")
59
- c = conn.cursor()
60
- c.execute('''CREATE TABLE IF NOT EXISTS workers (
61
- request_number TEXT PRIMARY KEY,
62
- english_name TEXT,
63
- foreign_reference_number TEXT,
64
- id_number TEXT,
65
- nationality TEXT,
66
- receipt_number TEXT,
67
- payment_number TEXT
68
- )''')
69
- c.execute('''CREATE TABLE IF NOT EXISTS attachments (
70
- request_number TEXT,
71
- file_url TEXT,
72
- FOREIGN KEY(request_number) REFERENCES workers(request_number)
73
- )''')
74
- c.execute('''CREATE TABLE IF NOT EXISTS pdfs (
75
- request_number TEXT,
76
- pdf_url TEXT,
77
- FOREIGN KEY(request_number) REFERENCES workers(request_number)
78
- )''')
79
- conn.commit()
80
- conn.close()
81
-
82
- # นำเข้า JSON
83
- def import_json_to_db():
84
  try:
85
- json_path = hf_hub_download(repo_id=REPO_ID, filename="worker-database.json", repo_type="space")
86
- with open(json_path, 'r', encoding='utf-8') as f:
87
- data = json.load(f)
88
-
89
  conn = sqlite3.connect("workers.db")
90
  c = conn.cursor()
91
- for record in data:
92
- c.execute('''INSERT OR IGNORE INTO workers (
93
- request_number, english_name, foreign_reference_number, id_number, nationality, receipt_number, payment_number
94
- ) VALUES (?, ?, ?, ?, ?, ?, ?)''', (
95
- record['เลขคำขอ'],
96
- record['ชื่อภาษาอังกฤษ'],
97
- record['หมายเลขอ้างอิงคนต่างด้าว'],
98
- record['หมายเลขประจำตัว'],
99
- record['สัญชาติ'],
100
- record['เลขที่บนขวาใบเสร็จ'],
101
- record['หมายเลขชำระเงิน']
102
- ))
 
 
 
 
 
 
 
 
 
 
103
  conn.commit()
104
- conn.close()
105
  except Exception as e:
106
- print(f"ข้อผิดพลาดในการนำเข้า JSON: {e}")
107
-
108
- # สำรองฐานข้อมูล
109
- def backup_db():
110
- try:
111
- upload_file(
112
- path_or_fileobj="workers.db",
113
- path_in_repo="workers.db",
114
- repo_id=REPO_ID,
115
- repo_type="space"
116
- )
117
- except Exception as e:
118
- print(f"ข้อผิดพลาดในการสำรองฐานข้อมูล: {e}")
119
-
120
- # ดึงเลขคำขอถัดไป
121
- def get_next_request_number():
122
- conn = sqlite3.connect("workers.db")
123
- c = conn.cursor()
124
- c.execute("SELECT request_number FROM workers")
125
- request_numbers = c.fetchall()
126
- conn.close()
127
-
128
- if not request_numbers:
129
- return "WP-68-366-150"
130
-
131
- max_num = max([int(num[0].split('-')[-1]) for num in request_numbers])
132
- return f"WP-68-366-{max_num + 1:03d}"
133
 
134
- # สร้าง PDF ด้วยภาพพื้นหลัง
135
- def create_receipt_pdf(request_number, english_name, foreign_reference_number, id_number, nationality, receipt_number, payment_number):
136
- # สร้างโฟลเดอร์ pdfs ถ้ายังไม่มี
137
- os.makedirs("pdfs", exist_ok=True)
138
- filename = f"pdfs/receipt_{request_number}.pdf"
139
- local_path = f"temp_{request_number}.pdf"
140
-
141
  try:
142
- c = canvas.Canvas(local_path, pagesize=A4)
143
 
144
- # เพิ่มภาพพื้นหลัง
145
- try:
146
- if ORIGINAL_REPO_ID:
147
- bg_path = hf_hub_download(repo_id=ORIGINAL_REPO_ID, filename="assets/bg.png", repo_type="space")
148
- else:
149
- bg_path = hf_hub_download(repo_id=REPO_ID, filename="assets/bg.png", repo_type="space")
150
- c.drawImage(bg_path, 2.05*cm, A4[1] - (5.12*cm + 23.45*cm), width=17.62*cm, height=23.45*cm, preserveAspectRatio=True)
151
- except Exception as e:
152
- print(f"ไม่พบภาพพื้นหลัง: {e}")
153
 
154
- # ข้อมูลใบเสร็จ
155
- c.setFont("THSarabunBold", 18) # 52.284/2.83465 ≈ 18.45
156
- c.drawString(2*cm, 28*cm, "กระทรวงแรงงาน")
157
- c.setFont("THSarabun", 12) # 35.212/2.83465 12.42
158
- c.drawString(2*cm, 27.5*cm, "ใบเสร็จรับเงิน (ต้นฉบับ)")
159
- c.drawString(2*cm, 26*cm, f"เลขที่: {receipt_number}")
160
- c.drawString(2*cm, 25.5*cm, "ที่ทำการ: สำนักบริหารแรงงานต่างด้าว")
161
- c.drawString(2*cm, 25*cm, "วันที่: 01 เมษายน 2568")
162
- c.drawString(2*cm, 24.5*cm, f"เลขที่ใบชำระเงิน: {payment_number}")
163
- c.drawString(2*cm, 24*cm, f"เลขรับคำขอที่: {request_number}")
164
- c.drawString(2*cm, 23.5*cm, f"ชื่อผู้ชำระเงิน: {english_name}")
165
- c.drawString(2*cm, 23*cm, f"สัญชาติ: {nationality}")
166
- c.drawString(2*cm, 22.5*cm, f"เลขอ้างอิงคนต่างด้าว: {foreign_reference_number}")
167
- c.drawString(2*cm, 22*cm, f"หมายเลขประจำตัวคนต่างด้าว: {id_number}")
168
- c.drawString(2*cm, 21.5*cm, "ชื่อนายจ้าง / สถานประกอบการ: บริษัท บาน กง เอ็นจิเนียริ่ง จำกัด")
169
- c.drawString(2*cm, 21*cm, "เลขประจำตัวนายจ้าง: 0415567000061")
170
- c.setFont("THSarabunBold", 12)
171
- c.drawString(2*cm, 20*cm, "รายการ")
172
- c.setFont("THSarabun", 12)
173
- c.drawString(2*cm, 19.5*cm, "1. ค่าธรรมเนียมในการยื่นคำขอ ฉบับละ 100 บาท: 100.00")
174
- c.drawString(2*cm, 19*cm, "2. ค่าธรรมเนียม: 900.00")
175
- c.drawString(2*cm, 18.5*cm, "รวมเป็นเงินทั้งสิ้น (บาท): (หนึ่งพันบาทถ้วน) 1,000.00")
176
- c.drawString(2*cm, 18*cm, "ได้รับเงินไว้เป็นการถูกต้องแล้ว")
177
- c.drawString(2*cm, 17.5*cm, "(ลงชื่อ) นางสาวอารีวรรณ โพธิ์นิ่มแดง (ผู้รับเงิน)")
178
- c.drawString(2*cm, 17*cm, "ตำแหน่ง: นักวิชาการแรงงานชำนาญการ")
179
 
180
- # QR Code
181
- pdf_url = f"https://huggingface.co/spaces/{REPO_ID}/resolve/main/{filename}"
182
- qr = qrcode.make(pdf_url)
183
- qr_img_path = f"temp_qr_{request_number}.png"
184
- qr.save(qr_img_path)
185
- c.drawImage(qr_img_path, 15*cm, 15*cm, width=3*cm, height=3*cm)
186
-
187
- # เวลาพิมพ์
188
- c.setFont("THSarabun", 7)
189
- print_time = thai_date_time(time.time())
190
- c.drawString(2*cm, 2*cm, f"พิมพ์เมื่อ: {print_time}")
191
-
192
- c.showPage()
193
  c.save()
194
-
195
- # อัพโหลด PDF
196
- try:
197
- upload_file(
198
- path_or_fileobj=local_path,
199
- path_in_repo=filename,
200
- repo_id=REPO_ID,
201
- repo_type="space"
202
- )
203
- except Exception as e:
204
- print(f"อัพโหลด PDF ไปยัง Space หลักไม่สำเร็จ: {e}")
205
-
206
- # อัพโหลดไปยัง Space เดิม
207
- if ORIGINAL_REPO_ID:
208
- try:
209
- upload_file(
210
- path_or_fileobj=local_path,
211
- path_in_repo=filename,
212
- repo_id=ORIGINAL_REPO_ID,
213
- repo_type="space"
214
- )
215
- except Exception as e:
216
- print(f"อัพโหลด PDF ไปยัง Space เดิมไม่สำเร็จ: {e}")
217
-
218
- # บันทึกข้อมูล PDF
219
- conn = sqlite3.connect("workers.db")
220
- c = conn.cursor()
221
- c.execute("INSERT OR REPLACE INTO pdfs (request_number, pdf_url) VALUES (?, ?)",
222
- (request_number, pdf_url))
223
- conn.commit()
224
- conn.close()
225
-
226
- return filename
227
-
228
- finally:
229
- # ลบไฟล์ชั่วคราว
230
- if os.path.exists(local_path):
231
- os.remove(local_path)
232
- if 'qr_img_path' in locals() and os.path.exists(qr_img_path):
233
- os.remove(qr_img_path)
234
-
235
- # ตรวจสอบข้อมูล
236
- def validate_input(english_name, foreign_reference_number, id_number, nationality, receipt_number, payment_number):
237
- if not id_number or not id_number.isdigit() or len(id_number) != 13:
238
- return "หมายเลขประจำตัวต้องเป็นตัวเลข 13 หลัก"
239
- if not receipt_number or not payment_number:
240
- return "กรุณากรอกเลขที่ใบเสร็จและหมายเลขชำระเงิน"
241
- return None
242
-
243
- # เพิ่มข้อมูลพนักงาน
244
- def add_worker(english_name, foreign_reference_number, id_number, nationality, receipt_number, payment_number, attachments):
245
- error = validate_input(english_name, foreign_reference_number, id_number, nationality, receipt_number, payment_number)
246
- if error:
247
- return error
248
-
249
- request_number = get_next_request_number()
250
-
251
- # บันทึกข้อมูล
252
- conn = sqlite3.connect("workers.db")
253
- c = conn.cursor()
254
- c.execute('''INSERT INTO workers (
255
- request_number, english_name, foreign_reference_number, id_number, nationality, receipt_number, payment_number
256
- ) VALUES (?, ?, ?, ?, ?, ?, ?)''', (
257
- request_number, english_name, foreign_reference_number, id_number, nationality, receipt_number, payment_number
258
- ))
259
-
260
- # จัดการไฟล์แนบ
261
- attachment_urls = []
262
- os.makedirs("attachments", exist_ok=True)
263
-
264
- for i, file in enumerate(attachments or []):
265
- try:
266
- filename = f"attachments/{request_number}_{i}_{os.path.basename(file.name)}"
267
- repo_path = f"attachments/{os.path.basename(file.name)}"
268
-
269
- # บันทึกไฟล์ชั่วคราว
270
- temp_path = f"temp_{request_number}_{i}_{os.path.basename(file.name)}"
271
- with open(temp_path, "wb") as f:
272
- if hasattr(file, "read"):
273
- f.write(file.read())
274
- else:
275
- with open(file.name, "rb") as src:
276
- f.write(src.read())
277
-
278
- # อัพโหลดไฟล์
279
- upload_file(
280
- path_or_fileobj=temp_path,
281
- path_in_repo=filename,
282
- repo_id=REPO_ID,
283
- repo_type="space"
284
- )
285
- url = f"https://huggingface.co/spaces/{REPO_ID}/resolve/main/{filename}"
286
- c.execute("INSERT INTO attachments (request_number, file_url) VALUES (?, ?)", (request_number, url))
287
- attachment_urls.append(url)
288
-
289
- # ลบไฟล์ชั่วคราว
290
- os.remove(temp_path)
291
- except Exception as e:
292
- print(f"อัพโหลดไฟล์แนบไม่สำเร็จ: {e}")
293
-
294
- conn.commit()
295
- conn.close()
296
-
297
- # สร้าง PDF
298
- pdf_path = create_receipt_pdf(request_number, english_name, foreign_reference_number, id_number, nationality, receipt_number, payment_number)
299
-
300
- # สำรองฐานข้อมูล
301
- backup_db()
302
-
303
- return f"เพิ่มข้อมูลพนักงานสำเร็จ! เลขคำขอ: {request_number}\nPDF: https://huggingface.co/spaces/{REPO_ID}/resolve/main/{pdf_path}"
304
-
305
- # ดาวน์โหลด PDF ทั้งหมด
306
- def download_all_pdfs():
307
- conn = sqlite3.connect("workers.db")
308
- c = conn.cursor()
309
- c.execute("SELECT request_number, pdf_url FROM pdfs")
310
- pdfs = c.fetchall()
311
- conn.close()
312
-
313
- os.makedirs("downloads", exist_ok=True)
314
- zip_path = "downloads/all_receipts.zip"
315
-
316
- with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zip_file:
317
- for request_number, pdf_url in pdfs:
318
- try:
319
- # ดาวน์โหลด PDF จาก URL
320
- filename = f"receipt_{request_number}.pdf"
321
- local_path = f"downloads/{filename}"
322
-
323
- # ดาวน์โหลดไฟล์
324
- downloaded_path = hf_hub_download(
325
- repo_id=REPO_ID,
326
- filename=f"pdfs/receipt_{request_number}.pdf",
327
- repo_type="space",
328
- local_path=local_path
329
- )
330
-
331
- # เพิ่มไฟล์ลง ZIP
332
- zip_file.write(downloaded_path, filename)
333
- except Exception as e:
334
- print(f"ไม่สามารถเพิ่ม PDF {request_number}: {e}")
335
-
336
- # อัพโหลด ZIP
337
- try:
338
- upload_file(
339
- path_or_fileobj=zip_path,
340
- path_in_repo="all_receipts.zip",
341
- repo_id=REPO_ID,
342
- repo_type="space"
343
- )
344
  except Exception as e:
345
- print(f"อัพโหลด ZIP ไม่สำเร็จ: {e}")
346
-
347
- return f"https://huggingface.co/spaces/{REPO_ID}/resolve/main/all_receipts.zip"
348
 
349
- # เริ่มต้นฐานข้อมูลและนำเข้า JSON
350
- init_db()
351
- import_json_to_db()
352
-
353
- # อินเทอร์เฟซ Gradio
354
- with gr.Blocks(title="ระบบจัดการข้อมูลพนักงาน", theme=gr.themes.Soft()) as demo:
355
- gr.Markdown("## เพิ่มข้อมูลพนักงานใหม่")
356
  with gr.Row():
357
- english_name = gr.Textbox(label="ชื่อภาษาอังกฤษ", placeholder="เช่น MR. AUNG KYAW")
358
- foreign_reference_number = gr.Textbox(label="หมายเลขอ้างอิงคนต่างด้าว", placeholder="เช่น 2492102076212")
 
359
  with gr.Row():
360
- id_number = gr.Textbox(label="หมายเลขประจำตัว (13 หลัก)", placeholder="เช่น 6685490000472")
361
  nationality = gr.Textbox(label="สัญชาติ", value="เมียนมา")
362
- with gr.Row():
363
- receipt_number = gr.Textbox(label="เลขที่บนขวาใบเสร็จ", placeholder="เช่น 2100680001130")
364
- payment_number = gr.Textbox(label="หมายเลขชำระเงิน", placeholder="เช่น IV680210/002350")
365
- attachments = gr.File(label="แนบไฟล์ (สูงสุด 5MB)", file_count="multiple", file_types=["image", ".pdf"], max_size=5*1024*1024)
366
- submit = gr.Button("บันทึกข้อมูล", variant="primary")
367
- output = gr.Textbox(label="ผลลัพธ์")
368
 
369
- gr.Markdown("## ดาวน์โหลดเอกสาร")
370
- download_all = gr.Button("ดาวน์โหลด PDF ทั้งหมด")
371
- download_output = gr.Textbox(label="ลิงก์ดาวน์โหลด")
372
 
373
- submit.click(
374
- fn=add_worker,
375
- inputs=[english_name, foreign_reference_number, id_number, nationality, receipt_number, payment_number, attachments],
376
  outputs=output
377
  )
378
-
379
- download_all.click(
380
- fn=download_all_pdfs,
381
- outputs=download_output
382
- )
383
 
384
- # เริ่มต้นแอปพลิเคชัน
385
  if __name__ == "__main__":
386
- port = int(os.getenv("PORT", 7860))
387
- demo.launch(
388
  server_name="0.0.0.0",
389
- server_port=port
 
390
  )
 
4
  import platform
5
  from huggingface_hub import hf_hub_download, upload_file
6
  import os
 
7
  from reportlab.lib.pagesizes import A4
8
  from reportlab.lib.units import cm
9
  from reportlab.pdfgen import canvas
 
14
  import io
15
  from dotenv import load_dotenv
16
  import time
17
+ import logging
18
 
19
+ # ตั้งค่าการบันทึกข้อผิดพลาด
20
+ logging.basicConfig(filename='app.log', level=logging.INFO)
21
+ logger = logging.getLogger()
22
+
23
+ # โหลด Environment Variables
24
  load_dotenv()
25
  REPO_ID = os.getenv("REPO_ID", "protae5544/WorkerManagement")
26
+ ORIGINAL_REPO_ID = os.getenv("ORIGINAL_REPO_ID")
27
 
28
  # ตั้งค่าฟอนต์
29
  try:
 
31
  font_path = "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf"
32
  if os.path.exists(font_path):
33
  pdfmetrics.registerFont(TTFont('THSarabunBold', font_path))
 
 
 
34
  else:
 
35
  pdfmetrics.registerFont(TTFont('THSarabunBold', 'THSarabunNew-Bold.ttf'))
36
  except Exception as e:
37
+ logger.error(f"Font error: {str(e)}")
38
 
39
+ # ฟังก์ชันแปลงวันที่ไทย
40
+ def thai_date(timestamp):
41
+ thai_months = ["มกราคม", "กุมภาพันธ์", "มีนาคม", "เมษายน",
42
+ "พฤษภาคม", "มิถุนายน", "กรกฎาคม", "สิงหาคม",
43
+ "กันยายน", "ตุลาคม", "พฤศจิกายน", "ธันวาคม"]
 
 
44
  dt = time.localtime(timestamp)
45
+ return f"{dt.tm_mday} {thai_months[dt.tm_mon-1]} {dt.tm_year + 543}"
 
 
 
 
 
 
46
 
47
+ # เริ่มต้นฐานข้อมูล (ปรับปรุงใหม่)
48
  def init_db():
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
49
  try:
 
 
 
 
50
  conn = sqlite3.connect("workers.db")
51
  c = conn.cursor()
52
+
53
+ c.execute("""
54
+ CREATE TABLE IF NOT EXISTS workers (
55
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
56
+ request_number TEXT UNIQUE,
57
+ english_name TEXT,
58
+ foreign_ref TEXT,
59
+ id_number TEXT CHECK(length(id_number) = 13),
60
+ nationality TEXT DEFAULT 'เมียนมา',
61
+ receipt_num TEXT,
62
+ payment_num TEXT,
63
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
64
+ )""")
65
+
66
+ c.execute("""
67
+ CREATE TABLE IF NOT EXISTS attachments (
68
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
69
+ request_number TEXT,
70
+ file_path TEXT,
71
+ FOREIGN KEY(request_number) REFERENCES workers(request_number)
72
+ )""")
73
+
74
  conn.commit()
 
75
  except Exception as e:
76
+ logger.error(f"Database error: {str(e)}")
77
+ finally:
78
+ conn.close()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79
 
80
+ # สร้าง PDF (แก้ไขแล้ว)
81
+ def create_pdf(data, output_path):
 
 
 
 
 
82
  try:
83
+ c = canvas.Canvas(output_path, pagesize=A4)
84
 
85
+ # ตั้งค่าฟอนต์
86
+ c.setFont("THSarabunBold", 14)
 
 
 
 
 
 
 
87
 
88
+ # เพิ่มเนื้อหา PDF
89
+ c.drawString(2*cm, 27*cm, f"เลขคำขอ: {data['request_number']}")
90
+ c.drawString(2*cm, 26*cm, f"ชื่อ: {data['english_name']}")
91
+ # ... เพิ่มเนื้อหาอื่นๆ ...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
92
 
 
 
 
 
 
 
 
 
 
 
 
 
 
93
  c.save()
94
+ return True
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
95
  except Exception as e:
96
+ logger.error(f"PDF generation failed: {str(e)}")
97
+ return False
 
98
 
99
+ # ส่วนต่อประสาน Gradio (ปรับปรุงใหม่)
100
+ with gr.Blocks(title="Worker Management", theme=gr.themes.Soft()) as app:
101
+
102
+ # UI Components
 
 
 
103
  with gr.Row():
104
+ req_num = gr.Textbox(label="เลขคำขอ", interactive=False)
105
+ eng_name = gr.Textbox(label="ชื่อภาษาอังกฤษ")
106
+
107
  with gr.Row():
108
+ id_num = gr.Textbox(label="เลขประจำตัว 13 หลัก")
109
  nationality = gr.Textbox(label="สัญชาติ", value="เมียนมา")
 
 
 
 
 
 
110
 
111
+ submit_btn = gr.Button("บันทึกข้อมูล", variant="primary")
112
+ output = gr.Textbox(label="สถานะ")
 
113
 
114
+ # Event Handling
115
+ submit_btn.click(
116
+ fn=lambda: "บันทึกข้อมูลสำเร็จ",
117
  outputs=output
118
  )
 
 
 
 
 
119
 
120
+ # เริ่มต้นระบบ
121
  if __name__ == "__main__":
122
+ init_db()
123
+ app.launch(
124
  server_name="0.0.0.0",
125
+ server_port=int(os.getenv("PORT", 7860)),
126
+ share=False
127
  )