03

เจ้าของรายการ / Staff Admin

วิธีจัดการทัวร์นาเมนต์ตั้งแต่ต้นจนจบ

🏆 Role: staff_admin หรือ tournament owner

3.1 Admin Dashboard

admin dashboard

รูปที่ 3.1 — หน้า admin.php — ศูนย์รวมการจัดการทั้งหมด

เมนูหลักใน Dashboard

3.2 สร้างรายการแข่งใหม่

ทำได้จาก Admin Dashboard → กดปุ่ม "+ สร้างรายการ"

ฟิลด์ที่ต้องกรอก

กลุ่มฟิลด์หมายเหตุ
ข้อมูลพื้นฐานtitleชื่อรายการ
start_date / end_dateวันแข่ง
locationสถานที่ + map_url (Google Maps)
provinceจังหวัด (ใช้ filter)
การแข่งmatch_modeweb ทั่วไป / association สมาคม (มีรุ่นอายุ)
available_eventsJSON list — ชายคู่, หญิงคู่, คู่ผสม, เดี่ยว ฯลฯ
available_age_categoriesสำหรับ association mode
การชำระเงินpayment_modemanual / manual_qr / slipok
payment_qr_imageรูป QR (สำหรับ manual_qr)
payment_amountยอดที่ต้องชำระ
slipok_branch_id / api_key(สำหรับ slipok)
Tab visibilitytab_result_enabledเปิด tab "ผลการแข่งขัน"
tab_shuttlecocks_enabledเปิด tab "จำนวนลูกแบด"
tab_photos_enabledเปิด tab "รูปภาพ"
tab_rules_enabledเปิด tab "กติกา"
Livelive_enabledเปิดปุ่ม "ดูสด"
youtube_live_urlURL embed
Notificationnotify_match_reminderเปิด LINE reminder 30/60 นาที
notify_court_changeเปิดแจ้งเปลี่ยนสนาม
notify_morning_broadcastเปิด morning broadcast

3.3 แก้ไขรายการแข่ง

edit match

รูปที่ 3.3 — edit_match.php — มี multi-section + sensitive changes

การเปลี่ยน "สถานะ"

เปลี่ยนผ่าน dropdown — มี 4 ค่า:

⚠️ Sensitive Changes

การเปลี่ยน payment_mode, slipok_api_key, อายุของรายการ ต้องผ่าน OTP confirmation ผ่าน apply_sensitive_changes.php

3.4 ตั้งค่าระบบชำระเงิน (Payment Modes)

โหมด 1: Manual

โหมด 2: Manual QR

โหมด 3: SlipOK (อัตโนมัติ)

verify slips
  1. สมัคร SlipOK API ที่ slipok.com → ได้ branch_id + api_key
  2. กรอกใน edit_match.php ที่ฟิลด์ slipok_branch_id + slipok_api_key
  3. ผู้เล่นอัปโหลดสลิป → SlipOK ตรวจ: ยอดเงิน, ชื่อผู้รับ, trans_ref, duplicate check
  4. ผ่าน → match_registrations.status='ผ่านชำระแล้ว', slip_auto_verified=1
  5. ไม่ผ่าน → ตกมาให้แอดมินตรวจด้วยมือ
💡 ความถูกต้องสูง

SlipOK ใช้ OCR + database ของธนาคารตรวจ trans_ref — แม่นยำเกือบ 100% และเร็ว ~5 วินาที

3.5 ตรวจสลิป Manual

หน้า admin_verify_slips.php — แสดงสลิปที่รอตรวจทั้งหมด

ขั้นตอน

  1. ดูรูปสลิป (กดขยายได้)
  2. เทียบกับ: ชื่อบัญชีรับโอน, ยอดเงิน, วันที่
  3. กด "✓ อนุมัติ" → สถานะ "ผ่านชำระแล้ว"
  4. หรือกด "✗ ปฏิเสธ" → ใส่เหตุผล (เช่น "ยอดไม่ตรง", "สลิปซ้ำ")
  5. ระบบส่ง notification ไปยังผู้เล่น + คู่ผ่าน Inbox + LINE
🚨 ระวังสลิปปลอม

ตรวจ ชื่อผู้รับโอน ทุกครั้ง! สลิปปลอมมักเปลี่ยนเฉพาะชื่อผู้โอน — ระบบ SlipOK ป้องกันได้ดีกว่า manual

3.6 ตั้งค่าสายแข่ง (Bracket Config)

หลังปิดรับสมัคร → ต้องจัดสายการแข่งก่อน

รูปแบบที่รองรับ

รูปแบบคำอธิบายใช้กับ
Round-robin onlyแบ่งกลุ่ม แต่ละคู่แข่งทุกคู่ในกลุ่มผู้เล่นน้อย, ลีก
Single Eliminationแพ้คัดออก รอบเดียวทัวร์ทั่วไป
Double Eliminationมี loser bracketมืออาชีพ
Group + KOแบ่งกลุ่มก่อน → ทีมต้น ๆ ไป knockoutทัวร์ใหญ่
manage group

รูปที่ 3.6 — admin_manage_group.php — จัดกลุ่ม + คะแนน

3.7 Schedule Planner — วางตารางแข่ง

schedule planner

รูปที่ 3.7 — admin_schedule_planner.php — auto schedule

ฟีเจอร์

Input parameters

3.8 พิมพ์ใบลงคะแนน (Scoresheet)

print scoresheet

รูปที่ 3.8 — admin_print_scoresheet.php — A4 Landscape

รูปแบบที่พิมพ์ได้

หน้า A4 Landscape — ทดสอบและปรับ margin เพื่อให้พิมพ์ตรงทุก browser (Chrome, Safari, Firefox)

3.9 ป้อนคะแนนสด (Live Scoring)

live match

รูปที่ 3.9 — admin_live_match.php

วิธีป้อนคะแนน

  1. เปิด admin_live_match.php?id=N
  2. เลือกคู่ที่กำลังแข่งจากตาราง
  3. กรอกคะแนนใน input field — รองรับหลายรูปแบบ:
    • 21 15 21 10 → auto-format เป็น 21-15, 21-10
    • 21-15 21-10 → คงรูปแบบ
    • 21-19 18-21 21-15 → 3 เซ็ต
  4. กด "บันทึก" — ระบบ:
    • อัปเดต group_standings auto (W/D/L, set diff, point diff)
    • เรียก autoAdvanceKnockout() ถ้าเป็นแมตช์น็อกเอาต์ → ส่งทีมชนะไปรอบถัดไป
    • Broadcast ผ่าน match_order_api.php ให้ scoreboard + OBS อัปเดต
💡 Real-time Co-work

หากกรรมการหลายคนป้อนพร้อมกัน — ระบบใช้ editing_presence table แสดงว่าใครกำลังแก้ field ไหน (TTL 5 วินาที)

3.10 จัดการรอบน็อกเอาต์ (Knockout)

manage knockout

รูปที่ 3.10 — admin_manage_knockout.php

โครงสร้าง

ตาราง knockout_matches ใช้ symbolic reference:

เมื่อ admin ป้อนคะแนนแมตช์ที่ 1 → ระบบเรียก autoAdvanceKnockout() recursively walk tree → แทนที่ W1 ในแมตช์ลูก ด้วยชื่อทีมจริง

3.11 จัดการลำดับการแข่ง (Order of Play)

manage order

รูปที่ 3.11 — admin_manage_order.php

ทำได้

⚠️ ถ้าเปลี่ยนสนาม/เวลา

หาก notify_court_change เปิดอยู่ — ระบบจะส่ง LINE notification ไปยังผู้เล่นทั้งคู่ทันที

3.12 Live Scoreboard (Kiosk Display)

หน้าจอแสดงผลขนาดใหญ่ — สำหรับ TV/Projector ในงานแข่ง

💡 ใช้งาน

เปิด admin_scoreboard.php?id=N บน TV → เต็มจอ (F11) → อัปเดต auto ทุก 1 วินาที

3.13 OBS Overlay — สำหรับ Live Streaming

ตั้งค่า OBS

  1. เปิด OBS Studio
  2. เพิ่ม Source: Browser Source
  3. URL: https://thaibadtournaments.com/badminton/admin_obs_overlay.php?id=N&court=1
  4. Width: 1920, Height: 1080
  5. เลือก "Custom CSS" → ปรับสี/ขนาดตามต้องการ
  6. กด "OK" → overlay จะแสดงทับวิดีโอแบบโปร่งใส
💡 พารามิเตอร์ที่ปรับได้
  • ?court=1 — แสดงเฉพาะคอร์ทที่ 1
  • ?theme=dark — ใช้ธีมเข้ม
  • ?style=compact — ขนาดเล็ก (สำหรับมุมจอ)

อ่านเพิ่มเติม: ไฟล์ OBS overlay.md ใน root

3.14 TTS เรียกคิว (Court Call)

ระบบเรียกชื่อนักกีฬาผ่าน Text-to-Speech

3 เครื่องมือ TTS

เครื่องมือคุณภาพความเร็วราคา
Gemini AI (default)⭐⭐⭐⭐⭐ ดีที่สุด2-3 วินาที100 RPD ฟรี
Google Translate TTS⭐⭐⭐1 วินาทีฟรี ไม่จำกัด
Browser SpeechSynthesis⭐⭐ทันทีฟรี

การเรียกใช้

  1. เปิด tts_court_call.php?id=N บนเครื่องที่มีลำโพง/เครื่องเสียง
  2. เลือกคิวที่ต้องการเรียก
  3. กด "เรียก" — ระบบจะอ่าน "สนาม X เชิญทีม Y และ Z"

TTS Cache

tts cache

ระบบ cache เสียงด้วย SHA256(text+voice).wav ใน /uploads/tts_cache/

3.15 LINE Broadcast

line broadcast

รูปที่ 3.15 — admin_line_broadcast.php

การส่งข้อความหมู่

  1. เลือก กลุ่มเป้าหมาย:
    • ทั้งหมด
    • ตามจังหวัด
    • ตามรายการแข่งที่สมัครไว้
    • ตามรุ่นอายุ/เพศ
  2. เลือก รูปแบบ: Plain text หรือ Flex Message
  3. เขียนข้อความ → Preview ก่อนส่ง
  4. กด "ส่ง" → ระบบ multicast batch 500 UIDs/ครั้ง
⚠️ LINE Quota

LINE Messaging API จำกัด push quota ต่อเดือน — ตรวจสอบที่ LINE Developer Console ก่อนส่งหมู่ทั้งหมด

3.16 Morning Broadcast (สรุปตารางวันแข่ง)

ส่งสรุปตารางการแข่งของผู้เล่นแต่ละคนตอน 06:00 ของวันแข่ง

วิธีตั้ง

  1. เปิด admin_morning_broadcast.php
  2. เลือกรายการ + วันที่
  3. กด "ดู Preview" — ระบบรวบรวม matches ของผู้เล่นทุกคน, group ตาม user
  4. กด "ส่งทันที" หรือ "ตั้งเวลาส่ง"

แต่ละผู้เล่นจะได้ 1 ข้อความเดียว สรุปทุกแมตช์ของตัวเอง (ไม่ซ้ำแม้สมัครหลายรุ่น)

การ Automate

ตั้ง cron job ใน server ให้รัน admin_morning_broadcast.php?auto=1&date=TODAY ตอน 06:00 ทุกวัน

3.17 ตรวจสอบการยืนยันตัวตน

verify identity

รูปที่ 3.17 — admin_verify_identity.php

ขั้นตอน

  1. ดูรูปบัตรประชาชนของผู้สมัคร (กดขยายได้)
  2. เปรียบเทียบกับข้อมูลที่กรอก: ชื่อ, วันเกิด, เพศ
  3. กด "✓ อนุมัติ" → ระบบ:
    • ตั้ง users.identity_verified = 1
    • ลบรูปบัตรประชาชนทันที (privacy-first)
    • ส่ง notification ผ่าน Inbox + LINE
  4. หรือกด "✗ ปฏิเสธ" → ใส่เหตุผล (เช่น "รูปไม่ชัด", "ข้อมูลไม่ตรง")

3.18 จัดการผู้ใช้

manage users

รูปที่ 3.18 — manage_users.php

การจัดการ

3.19 Visitor Analytics

visitor logs

รูปที่ 3.19 — admin_visitor_logs.php

ข้อมูลที่เก็บ

Tableเก็บอะไร
visitor_sessions1 session = 1 user open browser, IP, device, browser, referrer
visitor_pageviewsหน้าที่เปิด + duration (จาก heartbeat ทุก 30 วินาที)

Metrics

3.20 Error Log Viewer

error log

รูปที่ 3.20 — admin_errors.php

การทำงาน

การใช้งานหน้านี้

3.21 Player Stats / Head-to-Head

player stats

รูปที่ 3.21 — admin_player_stats.php

ดูได้

3.22 จัดการลูกแบดมินตัน + Export

Shuttlecocks Tracker

shuttlecocks

รูปที่ 3.22 — admin_shuttlecocks.php — บันทึกลูกที่ใช้

Export Registrations

เข้า export_registrations.php?id=N → ดาวน์โหลด CSV/Excel ของผู้สมัครทั้งหมด

จังหวัดในปฏิทิน

calendar province

admin_calendar_province.php — เพิ่ม/แก้ไขจังหวัดให้ตัวกรอง