{"openapi":"3.0.3","info":{"title":"Yulgang Rebuild: ยุทธจักร M — API Documentation","version":"1.0.0","description":"เอกสาร API สำหรับระบบร้านค้า ซื้อ-ขายเงิน M เกม Yulgang PlayPark PC\nครอบคลุมระบบบัญชีต้นทุนคลังสต็อก (COGS & P&L), กระเป๋าเงินบาท (THB Wallet), กระเป๋าเงิน M ลูกค้า (M-Wallet), ระบบรับซื้อ M คืน (Buyback), ระบบคำสั่งซื้อ และระบบหลังบ้าน Admin","contact":{"name":"ทีมพัฒนาระบบ Yulgang Rebuild"}},"servers":[{"url":"/","description":"เซิร์ฟเวอร์ปัจจุบัน (Current Environment)"}],"tags":[{"name":"Authentication","description":"ระบบเข้าสู่ระบบ สมัครสมาชิก ตรวจสอบสถานะ และออกจากระบบ"},{"name":"Shop & Packages","description":"รายการแพ็กเกจ เรทเงิน M และภาพรวมสต็อกคงเหลือ"},{"name":"Orders","description":"คำสั่งซื้อเงิน M และการยกเลิกคำสั่งซื้อ"},{"name":"THB Wallet","description":"กระเป๋าเงินบาท เติมเงิน แจ้งสลิป และรายการธนาคาร"},{"name":"Customer M-Wallet & Buyback","description":"กระเป๋าเงิน M ของลูกค้า และการขาย M คืนให้ระบบ"},{"name":"Member - Rank & Bonus","description":"ระบบระดับสมาชิก Tier, สิทธิประโยชน์, และการกดรับโบนัสประจำวัน (Huaybee/Reven Pattern)"},{"name":"Admin - Stock & COGS","description":"ระบบจัดการสต็อก บัญชีต้นทุน Moving-Average, COGS, และ P&L"},{"name":"Admin - Buyback","description":"ระบบรับซื้อ M คืนจากลูกค้า นัดรับในเกม และจ่ายเงินเข้ากระเป๋า"},{"name":"Admin - Orders","description":"จัดการคำสั่งซื้อลูกค้า อัปเดตสถานะ ส่งมอบ และคืนเงิน"},{"name":"Admin - Packages","description":"จัดการแพ็กเกจขาย M (พร้อมระบบล็อกป้องกันขายขาดทุน)"},{"name":"Admin - Deposits","description":"ตรวจสอบและอนุมัติการแจ้งเติมเงินบาท"},{"name":"Admin - Settings","description":"ตั้งค่าเรทขายออก/รับซื้อคืน ค่าธรรมเนียม และสถานะร้าน"},{"name":"Admin - Reports & System","description":"รายงานสรุปรายได้ รายชื่อผู้ใช้ และแบนเนอร์"}],"components":{"securitySchemes":{"cookieAuth":{"type":"apiKey","in":"cookie","name":"yg_session","description":"Session Cookie ที่ได้รับหลังจากเข้าสู่ระบบสำเร็จ (yg_session)"}},"schemas":{"ErrorResponse":{"type":"object","properties":{"error":{"type":"string","example":"ข้อความแจ้งข้อผิดพลาด"}}},"User":{"type":"object","properties":{"id":{"type":"integer","example":1},"username":{"type":"string","example":"user123"},"role":{"type":"string","enum":["user","admin"],"example":"user"},"bank_name":{"type":"string","example":"KBANK"},"bank_account_no":{"type":"string","example":"1234567890"},"balance_satang":{"type":"integer","example":150000,"description":"ยอดเงินบาท (หน่วยสตางค์)"},"created_at":{"type":"string","format":"date-time"}}},"Package":{"type":"object","properties":{"id":{"type":"integer","example":1},"code":{"type":"string","example":"starter-m"},"name":{"type":"string","example":"เซ็ตเริ่มต้นยุทธจักร"},"m_amount":{"type":"integer","example":100},"bonus_m":{"type":"integer","example":5},"price_satang":{"type":"integer","example":14000},"badge":{"type":"string","example":"คุ้มค่า"},"description":{"type":"string","example":"เหมาะสำหรับผู้เล่นเริ่มต้น"},"popular":{"type":"boolean","example":true},"active":{"type":"boolean","example":true}}},"Order":{"type":"object","properties":{"id":{"type":"integer","example":1},"order_no":{"type":"string","example":"YG-20261006-ABCD"},"user_id":{"type":"integer","example":1},"character_name":{"type":"string","example":"กระบี่ไร้พ่าย"},"server":{"type":"string","example":"honbal"},"faction":{"type":"string","example":"ธรรมะ"},"m_amount":{"type":"integer","example":500},"price_satang":{"type":"integer","example":70000},"cogs_satang":{"type":"integer","example":55000,"description":"ต้นทุนสินค้าขาย (สตางค์)"},"status":{"type":"string","enum":["PENDING","PROCESSING","DELIVERED","CANCELLED","REFUNDED","REJECTED"]},"created_at":{"type":"string","format":"date-time"}}},"BuybackRequest":{"type":"object","properties":{"id":{"type":"integer","example":1},"request_no":{"type":"string","example":"BB-20261006-ABCD"},"user_id":{"type":"integer","example":1},"server_id":{"type":"string","example":"honbal"},"server_name":{"type":"string","example":"ฮอนบัล"},"character_name":{"type":"string","example":"กระบี่ไร้พ่าย"},"amount_m":{"type":"integer","example":2000},"rate_thb":{"type":"number","example":1.15},"payout_satang":{"type":"integer","example":230000},"payout_method":{"type":"string","enum":["WALLET","BANK"],"example":"WALLET"},"status":{"type":"string","enum":["PENDING","ACCEPTED","COMPLETED","REJECTED","CANCELLED"]},"created_at":{"type":"string","format":"date-time"}}},"StockFinancials":{"type":"object","properties":{"totalStockM":{"type":"integer","example":102000},"totalInventoryValueSatang":{"type":"integer","example":11230000},"totalRealizedRevenueSatang":{"type":"integer","example":294000},"totalRealizedM":{"type":"integer","example":2205},"totalCogsSatang":{"type":"integer","example":242550},"totalGrossProfitSatang":{"type":"integer","example":51450},"grossMarginPct":{"type":"number","example":17.5},"avgPurchaseCostPerMSatang":{"type":"integer","example":110},"sellingRateSatang":{"type":"integer","example":140}}},"MemberRankConfig":{"type":"object","properties":{"name":{"type":"string","example":"gold"},"title":{"type":"string","example":"โกลด์ (Gold)"},"min_spent_satang":{"type":"integer","example":200000},"daily_bonus_satang":{"type":"integer","example":1500},"bonus_m_percent":{"type":"number","example":2},"cashback_percent":{"type":"number","example":2},"badge_color":{"type":"string","example":"#ffd700"},"sort_order":{"type":"integer","example":3}}},"MemberRankProfile":{"type":"object","properties":{"userId":{"type":"integer","example":1},"username":{"type":"string","example":"player1"},"currentRank":{"$ref":"#/components/schemas/MemberRankConfig"},"nextRank":{"$ref":"#/components/schemas/MemberRankConfig"},"totalSpentSatang":{"type":"integer","example":250000},"totalSpentThb":{"type":"string","example":"2500.00"},"neededForNextThb":{"type":"string","example":"2500.00"},"progressPercent":{"type":"integer","example":50},"dailyBonusThb":{"type":"string","example":"15.00"},"hasClaimedToday":{"type":"boolean","example":false},"allRanks":{"type":"array","items":{"$ref":"#/components/schemas/MemberRankConfig"}}}},"BonusClaim":{"type":"object","properties":{"id":{"type":"integer","example":1},"user_id":{"type":"integer","example":1},"claim_type":{"type":"string","example":"DAILY_RANK_BONUS"},"claim_date":{"type":"string","example":"2026-10-06"},"amount_satang":{"type":"integer","example":1500},"rank_at_claim":{"type":"string","example":"gold"},"note":{"type":"string","example":"โบนัสประจำวันระดับ โกลด์ (Gold)"},"created_at":{"type":"string","example":"2026-10-06T03:00:00.000Z"}}}}},"paths":{"/api/auth/register":{"post":{"tags":["Authentication"],"summary":"สมัครสมาชิกใหม่","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["username","password","bankName","bankAccountNo"],"properties":{"username":{"type":"string","example":"heroplayer"},"password":{"type":"string","example":"Password123!"},"bankName":{"type":"string","example":"KBANK"},"bankAccountNo":{"type":"string","example":"1234567890"}}}}}},"responses":{"201":{"description":"สมัครสมาชิกสำเร็จและล็อกอินอัตโนมัติ"},"400":{"description":"ข้อมูลไม่ครบถ้วนหรือไม่ถูกต้อง","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/auth/login":{"post":{"tags":["Authentication"],"summary":"เข้าสู่ระบบ","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["username","password"],"properties":{"username":{"type":"string","example":"admin"},"password":{"type":"string","example":"admin1234"}}}}}},"responses":{"200":{"description":"เข้าสู่ระบบสำเร็จ (คืน session cookie)"},"401":{"description":"ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/auth/me":{"get":{"tags":["Authentication"],"summary":"ดูข้อมูลผู้ใช้ปัจจุบันและยอดเงินคงเหลือ","security":[{"cookieAuth":[]}],"responses":{"200":{"description":"ข้อมูลผู้ใช้","content":{"application/json":{"schema":{"properties":{"user":{"$ref":"#/components/schemas/User"}}}}}},"401":{"description":"ยังไม่ได้เข้าสู่ระบบ"}}}},"/api/auth/logout":{"post":{"tags":["Authentication"],"summary":"ออกจากระบบ (ล้าง Cookie)","responses":{"200":{"description":"ออกจากระบบสำเร็จ"}}}},"/api/packages":{"get":{"tags":["Shop & Packages"],"summary":"ดึงรายการแพ็กเกจขาย M, เรทราคา และสต็อกคงเหลือ","responses":{"200":{"description":"รายการแพ็กเกจและสต็อก","content":{"application/json":{"schema":{"type":"object","properties":{"packages":{"type":"array","items":{"$ref":"#/components/schemas/Package"}},"mRateThb":{"type":"number","example":1.4},"transferFeeThb":{"type":"number","example":15},"stock":{"type":"object","description":"ข้อมูลสต็อกคงเหลือแยกรายเซิร์ฟเวอร์"}}}}}}}}},"/api/orders":{"get":{"tags":["Orders"],"summary":"ดูรายการคำสั่งซื้อของผู้ใช้ปัจจุบัน","security":[{"cookieAuth":[]}],"responses":{"200":{"description":"รายการออเดอร์","content":{"application/json":{"schema":{"properties":{"orders":{"type":"array","items":{"$ref":"#/components/schemas/Order"}}}}}}},"401":{"description":"ไม่ได้เข้าสู่ระบบ"}}},"post":{"tags":["Orders"],"summary":"สร้างคำสั่งซื้อเงิน M (ตรวจสอบสต็อกและตัดยอดเงินบาทในกระเป๋า)","security":[{"cookieAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["characterName","server","mAmount","priceThb"],"properties":{"characterName":{"type":"string","example":"จอมยุทธ์สวรรค์"},"server":{"type":"string","example":"honbal"},"faction":{"type":"string","example":"ธรรมะ"},"mAmount":{"type":"integer","example":500},"priceThb":{"type":"number","example":715},"packageCode":{"type":"string","example":"custom-m"}}}}}},"responses":{"201":{"description":"สร้างคำสั่งซื้อสำเร็จ"},"400":{"description":"ยอดเงินไม่พอ หรือสต็อกไม่พอ หรือตรวจพบการขายขาดทุน","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/orders/{id}/cancel":{"post":{"tags":["Orders"],"summary":"ผู้ใช้ขอยกเลิกคำสั่งซื้อที่รอส่งมอบ (คืนเงินและสต็อกอัตโนมัติ)","security":[{"cookieAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"ยกเลิกคำสั่งซื้อสำเร็จ คืนเงินและสต็อกแล้ว"},"400":{"description":"ไม่สามารถยกเลิกได้ (กำลังดำเนินการหรือส่งมอบแล้ว)"}}}},"/api/wallet/deposit":{"post":{"tags":["THB Wallet"],"summary":"แจ้งเติมเงินบาท (โอนผ่านธนาคาร)","security":[{"cookieAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["bankId","amountSatang","transferDate","transferTime"],"properties":{"bankId":{"type":"integer","example":1},"amountSatang":{"type":"integer","example":100000,"description":"จำนวนเงินเป็นสตางค์ (1,000 บาท)"},"transferDate":{"type":"string","example":"2026-10-06"},"transferTime":{"type":"string","example":"14:30"},"slipUrl":{"type":"string","example":"/uploads/slips/slip1.jpg"}}}}}},"responses":{"201":{"description":"แจ้งเติมเงินสำเร็จ รอแอดมินตรวจสอบ"}}}},"/api/wallet/deposits":{"get":{"tags":["THB Wallet"],"summary":"ดูประวัติการแจ้งเติมเงินบาทของผู้ใช้","security":[{"cookieAuth":[]}],"responses":{"200":{"description":"ประวัติการเติมเงิน"}}}},"/api/wallet/banks":{"get":{"tags":["THB Wallet"],"summary":"ดูรายการบัญชีธนาคารของทางร้านสำหรับโอนเงินเข้า","responses":{"200":{"description":"รายการธนาคารร้านค้า"}}}},"/api/wallet/m-wallet":{"get":{"tags":["Customer M-Wallet & Buyback"],"summary":"ดูยอดเงิน M คงเหลือของผู้ใช้แยกตามเซิร์ฟเวอร์ และเรทซื้อ-ขาย","security":[{"cookieAuth":[]}],"responses":{"200":{"description":"ยอดคงเหลือ M รายเซิร์ฟเวอร์","content":{"application/json":{"schema":{"type":"object","properties":{"balances":{"type":"array","items":{"type":"object","properties":{"server_id":{"type":"string"},"server_name":{"type":"string"},"balance_m":{"type":"integer"}}}},"totalM":{"type":"integer","example":5000},"rates":{"type":"object","properties":{"buyRateThb":{"type":"number","example":1.15},"sellRateThb":{"type":"number","example":1.4}}}}}}}}}}},"/api/wallet/buyback":{"get":{"tags":["Customer M-Wallet & Buyback"],"summary":"ดูประวัติคำขอขายเงิน M คืนให้ระบบของผู้ใช้","security":[{"cookieAuth":[]}],"responses":{"200":{"description":"ประวัติคำขอขาย M คืน"}}},"post":{"tags":["Customer M-Wallet & Buyback"],"summary":"สร้างคำขอขายเงิน M คืนให้ระบบ (คำนวณเงินบาทตามเรทรับซื้อ)","security":[{"cookieAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["serverId","characterName","amountM"],"properties":{"serverId":{"type":"string","example":"honbal"},"characterName":{"type":"string","example":"กระบี่เพลิง"},"amountM":{"type":"integer","example":1000},"payoutMethod":{"type":"string","enum":["WALLET","BANK"],"example":"WALLET"},"bankName":{"type":"string","example":"KBANK"},"bankAccountNo":{"type":"string","example":"123-4-56789-0"},"bankAccountName":{"type":"string","example":"นายสมชาย ใจดี"},"contactInfo":{"type":"string","example":"089-123-4567"}}}}}},"responses":{"201":{"description":"สร้างคำขอสำเร็จ","content":{"application/json":{"schema":{"properties":{"request":{"$ref":"#/components/schemas/BuybackRequest"}}}}}},"400":{"description":"ข้อมูลไม่ครบถ้วน","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/member/rank":{"get":{"tags":["Member - Rank & Bonus"],"summary":"ดูข้อมูลระดับสมาชิก (Rank Tier), สิทธิประโยชน์, ยอดซื้อสะสม, ความคืบหน้าสู่ระดับถัดไป, และสถานะการรับโบนัสประจำวัน","security":[{"cookieAuth":[]}],"responses":{"200":{"description":"ข้อมูลระดับสมาชิกและสิทธิประโยชน์","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"profile":{"$ref":"#/components/schemas/MemberRankProfile"}}}}}},"401":{"description":"ยังไม่ได้เข้าสู่ระบบ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/member/bonus/claim":{"post":{"tags":["Member - Rank & Bonus"],"summary":"กดรับโบนัสประจำวันตามระดับสมาชิก (Daily Rank Bonus) — รับได้วันละ 1 ครั้ง ตามเวลาไทย (UTC+7) เงินเข้ากระเป๋าทันที","security":[{"cookieAuth":[]}],"responses":{"200":{"description":"รับโบนัสสำเร็จ","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"message":{"type":"string","example":"รับโบนัสสำเร็จ +15.00 ฿ เข้าสู่กระเป๋าเงินเรียบร้อย"},"amountSatang":{"type":"integer","example":1500},"amountThb":{"type":"string","example":"15.00"},"newBalanceSatang":{"type":"integer","example":451500},"newBalanceThb":{"type":"string","example":"4515.00"}}}}}},"400":{"description":"รับโบนัสแล้ววันนี้ หรือเกิดข้อผิดพลาด","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"ยังไม่ได้เข้าสู่ระบบ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/member/bonus/history":{"get":{"tags":["Member - Rank & Bonus"],"summary":"ดูประวัติการรับโบนัสประจำวันย้อนหลัง (สูงสุด 50 รายการ)","security":[{"cookieAuth":[]}],"responses":{"200":{"description":"ประวัติการรับโบนัส","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"claims":{"type":"array","items":{"$ref":"#/components/schemas/BonusClaim"}}}}}}},"401":{"description":"ยังไม่ได้เข้าสู่ระบบ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/member/ranks":{"get":{"tags":["Member - Rank & Bonus"],"summary":"ดูรายการระดับสมาชิกทั้งหมด (Bronze → Diamond VIP) พร้อมเงื่อนไขและสิทธิประโยชน์","responses":{"200":{"description":"รายการระดับสมาชิกทั้งหมด","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"ranks":{"type":"array","items":{"$ref":"#/components/schemas/MemberRankConfig"}}}}}}}}}},"/api/admin/stock":{"get":{"tags":["Admin - Stock & COGS"],"summary":"รายงานสถานะสต็อกคลังกลาง, มูลค่าสินค้าคงเหลือ, ต้นทุน COGS, กำไรขั้นต้น (P&L), และ Audit Ledger","security":[{"cookieAuth":[]}],"responses":{"200":{"description":"รายงานบัญชีสต็อก","content":{"application/json":{"schema":{"type":"object","properties":{"financials":{"$ref":"#/components/schemas/StockFinancials"},"ledger":{"type":"array","items":{"type":"object"}}}}}}},"403":{"description":"ต้องใช้สิทธิ์ Admin"}}}},"/api/admin/stock/restock":{"post":{"tags":["Admin - Stock & COGS"],"summary":"นำเข้าสต็อกเงิน M พร้อมบันทึกต้นทุนจริงและแหล่งที่มา (อัปเดต Moving-Average Cost)","security":[{"cookieAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["serverId","amountM","costThb"],"properties":{"serverId":{"type":"string","example":"honbal"},"amountM":{"type":"integer","example":50000},"costThb":{"type":"number","example":55000,"description":"ยอดเงินรวมที่จ่ายซื้อ M (เช่น 55,000 บาท = 1.10 ฿/M)"},"supplier":{"type":"string","example":"ตลาดกลาง Discord"},"note":{"type":"string","example":"ล็อตโปรโมชั่นต้นเดือน"}}}}}},"responses":{"201":{"description":"บันทึกนำเข้าสต็อกและคำนวณต้นทุนใหม่สำเร็จ"},"400":{"description":"ข้อมูลไม่ถูกต้อง"}}}},"/api/admin/stock/adjust":{"post":{"tags":["Admin - Stock & COGS"],"summary":"ปรับปรุงยอดสต็อกคลัง (ตรวจนับสต็อก / ตัดจำหน่ายสูญหาย)","security":[{"cookieAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["serverId","amountM","type","reason"],"properties":{"serverId":{"type":"string","example":"honbal"},"amountM":{"type":"integer","example":-500,"description":"จำนวนที่เพิ่มหรือลด"},"type":{"type":"string","enum":["ADJUST","WRITE_OFF"],"example":"WRITE_OFF"},"reason":{"type":"string","example":"สูญหายจากการโดนลงโทษในเกม"}}}}}},"responses":{"200":{"description":"ปรับปรุงสต็อกสำเร็จ"}}}},"/api/admin/buyback":{"get":{"tags":["Admin - Buyback"],"summary":"ดึงรายการคำขอขาย M คืนทั้งหมด (คัดกรองตามสถานะได้)","security":[{"cookieAuth":[]}],"parameters":[{"name":"status","in":"query","schema":{"type":"string","enum":["ALL","PENDING","ACCEPTED","COMPLETED","REJECTED"]}}],"responses":{"200":{"description":"รายการคำขอรับซื้อ M คืน"}}}},"/api/admin/buyback/{id}":{"patch":{"tags":["Admin - Buyback"],"summary":"จัดการคำขอขาย M คืน (นัดเดลในเกม / ยืนยันรับ M พร้อมจ่ายเงิน + เติมสต็อก / ปฏิเสธ)","security":[{"cookieAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["action"],"properties":{"action":{"type":"string","enum":["ACCEPT","COMPLETE","REJECT"],"example":"COMPLETE"},"note":{"type":"string","example":"นัดรับเมืองฮอนบัล Ch.1"},"reason":{"type":"string","example":"ตัวละครไม่มาตามนัด"}}}}}},"responses":{"200":{"description":"ดำเนินการสำเร็จ (หาก COMPLETE จะโอนเงินบาทเข้ากระเป๋าและเติม M เข้าสต็อกพร้อมบันทึกต้นทุนอัตโนมัติ)"},"400":{"description":"สถานะไม่ถูกต้อง"}}}},"/api/admin/settings":{"get":{"tags":["Admin - Settings"],"summary":"ดูการตั้งค่าระบบทั้งหมด (เรทขาย เรทรับซื้อ ค่าธรรมเนียม)","security":[{"cookieAuth":[]}],"responses":{"200":{"description":"ค่าคอนฟิกระบบ"}}},"put":{"tags":["Admin - Settings"],"summary":"แก้ไขการตั้งค่าระบบ (พร้อมระบบล็อกป้องกันการตั้งเรทขาดทุน)","security":[{"cookieAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"m_sell_rate_thb":{"type":"string","example":"1.40","description":"เรทขายเงิน M ออกให้ลูกค้า (ห้ามต่ำกว่าเรทรับซื้อและห้ามต่ำกว่าต้นทุนคลัง)"},"m_buy_rate_thb":{"type":"string","example":"1.15","description":"เรทรับซื้อเงิน M คืนจากลูกค้า (ห้ามสูงกว่าเรทขายออก)"},"transfer_fee_thb":{"type":"string","example":"15","description":"ค่าธรรมเนียมส่งพัสดุต่อรายการ"},"orders_open":{"type":"string","enum":["true","false"],"example":"true"}}}}}},"responses":{"200":{"description":"บันทึกการตั้งค่าสำเร็จ"},"400":{"description":"ละเมิดกฎป้องกันการขายขาดทุน (เช่น เรทขายต่ำกว่าต้นทุนคลัง หรือเรทรับซื้อสูงกว่าเรทขาย)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/admin/packages":{"get":{"tags":["Admin - Packages"],"summary":"ดึงรายการแพ็กเกจทั้งหมดสำหรับจัดการ","security":[{"cookieAuth":[]}],"responses":{"200":{"description":"รายการแพ็กเกจ"}}},"post":{"tags":["Admin - Packages"],"summary":"สร้างแพ็กเกจใหม่ (มีระบบตรวจราคาต่อ M รวมโบนัสไม่ให้ต่ำกว่าต้นทุน)","security":[{"cookieAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["code","name","mAmount","priceThb"],"properties":{"code":{"type":"string","example":"vip-m"},"name":{"type":"string","example":"แพ็กเกจจอมราชันย์"},"mAmount":{"type":"integer","example":10000},"bonusM":{"type":"integer","example":500},"priceThb":{"type":"number","example":14000},"badge":{"type":"string","example":"ยอดนิยม"},"description":{"type":"string","example":"คุ้มค่าที่สุด"}}}}}},"responses":{"201":{"description":"สร้างสำเร็จ"},"400":{"description":"ราคาเฉลี่ยต่อ M รวมโบนัสต่ำกว่าต้นทุนคลัง (ระบบล็อกป้องกันการขายขาดทุน)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/admin/packages/{id}":{"put":{"tags":["Admin - Packages"],"summary":"แก้ไขแพ็กเกจ (ตรวจสอบป้องกันการตั้งราคาขาดทุน)","security":[{"cookieAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"แก้ไขสำเร็จ"},"400":{"description":"ราคาเฉลี่ยต่อ M รวมโบนัสต่ำกว่าต้นทุนคลัง"}}},"delete":{"tags":["Admin - Packages"],"summary":"ลบแพ็กเกจ","security":[{"cookieAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"ลบสำเร็จ"}}}},"/api/admin/orders":{"get":{"tags":["Admin - Orders"],"summary":"ดึงรายการคำสั่งซื้อของระบบทั้งหมด","security":[{"cookieAuth":[]}],"responses":{"200":{"description":"รายการออเดอร์"}}}},"/api/admin/orders/{id}":{"patch":{"tags":["Admin - Orders"],"summary":"อัปเดตสถานะคำสั่งซื้อ (PROCESSING, DELIVERED, CANCELLED, REFUNDED)","security":[{"cookieAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"อัปเดตสถานะสำเร็จ (หาก CANCELLED/REFUNDED ระบบคืนสต็อกเข้าคลังอัตโนมัติ)"}}}},"/api/admin/deposits":{"get":{"tags":["Admin - Deposits"],"summary":"ดึงรายการแจ้งเติมเงินบาททั้งหมด","security":[{"cookieAuth":[]}],"responses":{"200":{"description":"รายการเติมเงิน"}}}},"/api/admin/deposits/{id}":{"patch":{"tags":["Admin - Deposits"],"summary":"อนุมัติหรือปฏิเสธรายการแจ้งเติมเงิน (หากอนุมัติจะเพิ่มยอดเงินบาทในกระเป๋าลูกค้าทันที)","security":[{"cookieAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"ดำเนินการสำเร็จ"}}}},"/api/admin/reports":{"get":{"tags":["Admin - Reports & System"],"summary":"รายงานสถิติรายรับ ยอดขาย แยกตามช่วงเวลา","security":[{"cookieAuth":[]}],"responses":{"200":{"description":"รายงานสถิติ"}}}},"/api/admin/users":{"get":{"tags":["Admin - Reports & System"],"summary":"ดึงรายชื่อผู้ใช้ทั้งหมดในระบบ","security":[{"cookieAuth":[]}],"responses":{"200":{"description":"รายชื่อผู้ใช้"}}}},"/api/carousels":{"get":{"tags":["Shop & Packages"],"summary":"ดึงภาพแบนเนอร์สไลด์สำหรับแสดงหน้าแรก","responses":{"200":{"description":"รายการแบนเนอร์"}}}}}}