{"openapi":"3.1.0","info":{"title":"Vehicle Request Service","description":"สร้างแบบ ๓ ใบขอใช้รถยนต์ส่วนกลาง (.docx). AI Agent เรียก `POST /api/v1/documents` ด้วย JSON เพื่อรับ `download_url`.","version":"1.0.0"},"paths":{"/api/v1/documents":{"post":{"tags":["Vehicle Request API (AI Agent Tools)"],"summary":"สร้างใบขอใช้รถยนต์ส่วนกลาง (แบบ ๓) ด้วย JSON Payload (.docx และ .pdf)","description":"สร้างเอกสาร 'แบบ ๓ ใบขอใช้รถยนต์ส่วนกลาง' (2 หน้า) จากข้อมูล JSON และคืนลิงก์ดาวน์โหลดทั้งไฟล์ Word (`download_url`) และไฟล์ PDF (`pdf_download_url`). วันที่ใช้รูปแบบ YYYY-MM-DD หรือ DD/MM/YYYY (ค.ศ. หรือ พ.ศ. ก็ได้), เวลา HH:MM (24 ชม.). ระบบแปลงเป็นชื่อเดือนไทยและปี พ.ศ. ให้อัตโนมัติ.","operationId":"create_vehicle_request_document","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VehicleRequestCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentResult"}}}},"401":{"description":"Invalid or missing X-API-Key"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/v1/generate":{"get":{"tags":["Vehicle Request API (AI Agent Tools)"],"summary":"สร้างใบขอใช้รถยนต์ส่วนกลาง (แบบ ๓) ผ่าน URL Query Parameters (GET)","description":"ช่วยให้ AI Agent หรือระบบอัตโนมัติสามารถสร้างเอกสารผ่าน URL Query Parameters ได้โดยตรง. หากส่ง `format=json` (ค่าเริ่มต้น) จะคืน JSON ที่มี `download_url` (.docx) และ `pdf_download_url` (.pdf). หากส่ง `format=docx` หรือ `download=1` จะดาวน์โหลดไฟล์ `.docx` ทันที. หากส่ง `format=pdf` จะดาวน์โหลดไฟล์ `.pdf` ทันที.","operationId":"generate_vehicle_request_by_url_params","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"requester_name","in":"query","required":true,"schema":{"type":"string","description":"ชื่อ-สกุลผู้ขอใช้รถ เช่น 'นายประพันธ์พงษ์ คงศรีรอด'","title":"Requester Name"},"description":"ชื่อ-สกุลผู้ขอใช้รถ เช่น 'นายประพันธ์พงษ์ คงศรีรอด'"},{"name":"requester_position","in":"query","required":true,"schema":{"type":"string","description":"ตำแหน่งผู้ขอใช้รถ เช่น 'นักวิชาการคอมพิวเตอร์ชำนาญการ'","title":"Requester Position"},"description":"ตำแหน่งผู้ขอใช้รถ เช่น 'นักวิชาการคอมพิวเตอร์ชำนาญการ'"},{"name":"driver_name","in":"query","required":true,"schema":{"type":"string","description":"ชื่อ-สกุลพนักงานขับรถ เช่น 'นายภาคิน กรณ์ธนกฤติ'","title":"Driver Name"},"description":"ชื่อ-สกุลพนักงานขับรถ เช่น 'นายภาคิน กรณ์ธนกฤติ'"},{"name":"license_plate","in":"query","required":true,"schema":{"type":"string","description":"หมายเลขทะเบียนรถ เช่น '2กย 9703 กทม.' หรือ 'ฮฐ 9343 กทม.'","title":"License Plate"},"description":"หมายเลขทะเบียนรถ เช่น '2กย 9703 กทม.' หรือ 'ฮฐ 9343 กทม.'"},{"name":"purpose","in":"query","required":true,"schema":{"type":"string","description":"วัตถุประสงค์การเดินทาง (ต่อจากคำว่า เพื่อ)","title":"Purpose"},"description":"วัตถุประสงค์การเดินทาง (ต่อจากคำว่า เพื่อ)"},{"name":"destination","in":"query","required":true,"schema":{"type":"string","description":"สถานที่ปลายทาง เช่น 'โรงแรมอัศวิน กรุงเทพ'","title":"Destination"},"description":"สถานที่ปลายทาง เช่น 'โรงแรมอัศวิน กรุงเทพ'"},{"name":"depart_date","in":"query","required":true,"schema":{"type":"string","description":"วันที่ออกเดินทาง YYYY-MM-DD หรือ DD/MM/YYYY","title":"Depart Date"},"description":"วันที่ออกเดินทาง YYYY-MM-DD หรือ DD/MM/YYYY"},{"name":"depart_time","in":"query","required":false,"schema":{"type":"string","description":"เวลาออกเดินทาง HH:MM เช่น '08:30'","default":"08:30","title":"Depart Time"},"description":"เวลาออกเดินทาง HH:MM เช่น '08:30'"},{"name":"return_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"วันที่เดินทางกลับ YYYY-MM-DD (ไม่ระบุ = วันเดียวกับวันไป)","title":"Return Date"},"description":"วันที่เดินทางกลับ YYYY-MM-DD (ไม่ระบุ = วันเดียวกับวันไป)"},{"name":"return_time","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"เวลาเดินทางกลับ HH:MM (เว้นว่างได้ถ้า return_until_finished=true)","title":"Return Time"},"description":"เวลาเดินทางกลับ HH:MM (เว้นว่างได้ถ้า return_until_finished=true)"},{"name":"return_until_finished","in":"query","required":false,"schema":{"type":"boolean","description":"true = พิมพ์คำว่า 'จนแล้วเสร็จ' ในช่องเวลากลับ","default":true,"title":"Return Until Finished"},"description":"true = พิมพ์คำว่า 'จนแล้วเสร็จ' ในช่องเวลากลับ"},{"name":"passenger_count","in":"query","required":false,"schema":{"type":"integer","maximum":99,"minimum":1,"description":"จำนวนคนนั่ง","default":2,"title":"Passenger Count"},"description":"จำนวนคนนั่ง"},{"name":"approver_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ชื่อผู้อนุมัติ (ไม่ระบุ = เว้นเส้นประว่างให้ลงนามจริง)","title":"Approver Name"},"description":"ชื่อผู้อนุมัติ (ไม่ระบุ = เว้นเส้นประว่างให้ลงนามจริง)"},{"name":"approver_title","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ตำแหน่งผู้อนุมัติ (ไม่ระบุ = เว้นเส้นประว่าง)","title":"Approver Title"},"description":"ตำแหน่งผู้อนุมัติ (ไม่ระบุ = เว้นเส้นประว่าง)"},{"name":"request_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"วันที่ทำเอกสาร YYYY-MM-DD (ไม่ระบุ = วันปัจจุบัน)","title":"Request Date"},"description":"วันที่ทำเอกสาร YYYY-MM-DD (ไม่ระบุ = วันปัจจุบัน)"},{"name":"format","in":"query","required":false,"schema":{"type":"string","pattern":"^(json|docx|pdf)$","description":"'json' คืนลิงก์ดาวน์โหลด, 'docx' ดาวน์โหลด Word, 'pdf' ดาวน์โหลด PDF","default":"json","title":"Format"},"description":"'json' คืนลิงก์ดาวน์โหลด, 'docx' ดาวน์โหลด Word, 'pdf' ดาวน์โหลด PDF"},{"name":"download","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"ส่ง download=1 เพื่อดาวน์โหลดไฟล์ .docx ทันที","title":"Download"},"description":"ส่ง download=1 เพื่อดาวน์โหลดไฟล์ .docx ทันที"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{file_id}":{"get":{"tags":["Vehicle Request API (AI Agent Tools)"],"summary":"ดาวน์โหลดไฟล์ .docx ที่สร้างแล้ว","operationId":"download_vehicle_request_document","parameters":[{"name":"file_id","in":"path","required":true,"schema":{"type":"string","title":"File Id"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","pattern":"^(docx|pdf)$","description":"'docx' หรือ 'pdf'","default":"docx","title":"Format"},"description":"'docx' หรือ 'pdf'"}],"responses":{"200":{"description":"Successful Response","content":{"application/vnd.openxmlformats-officedocument.wordprocessingml.document":{}}},"404":{"description":"Not found or expired"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{file_id}/pdf":{"get":{"tags":["Vehicle Request API (AI Agent Tools)"],"summary":"ดาวน์โหลดไฟล์ .pdf ที่สร้างแล้ว","operationId":"download_vehicle_request_pdf_document","parameters":[{"name":"file_id","in":"path","required":true,"schema":{"type":"string","title":"File Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/pdf":{}}},"404":{"description":"Not found or expired"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/options":{"get":{"tags":["Vehicle Request API (AI Agent Tools)"],"summary":"รายการทะเบียนรถ / พนักงานขับรถ / ผู้อนุมัติ / ผู้ขอใช้รถ","operationId":"list_vehicle_request_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OptionsResult"}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/v1/health":{"get":{"tags":["Vehicle Request API (AI Agent Tools)"],"summary":"Health check","operationId":"vehicle_request_health","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResult"}}}}}}}},"components":{"schemas":{"DocumentResult":{"properties":{"file_id":{"type":"string","title":"File Id","description":"รหัสเอกสาร (hex 32 ตัว) ใช้ดาวน์โหลดผ่าน download_url หรือ pdf_download_url"},"filename":{"type":"string","title":"Filename","description":"ชื่อไฟล์ .docx ที่แนะนำสำหรับบันทึก"},"pdf_filename":{"type":"string","title":"Pdf Filename","description":"ชื่อไฟล์ .pdf ที่แนะนำสำหรับบันทึก"},"download_url":{"type":"string","title":"Download Url","description":"ลิงก์ดาวน์โหลดไฟล์ .docx (GET) เปิดได้โดยไม่ต้องใช้ API key"},"pdf_download_url":{"type":"string","title":"Pdf Download Url","description":"ลิงก์ดาวน์โหลดไฟล์ .pdf (GET) เปิดได้โดยไม่ต้องใช้ API key"},"expires_at":{"type":"string","format":"date-time","title":"Expires At","description":"เวลาที่ไฟล์จะถูกลบอัตโนมัติ (ISO 8601, Asia/Bangkok)"}},"type":"object","required":["file_id","filename","pdf_filename","download_url","pdf_download_url","expires_at"],"title":"DocumentResult","description":"Result returned after a document is generated."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthResult":{"properties":{"status":{"type":"string","title":"Status","description":"'ok' เมื่อบริการพร้อมใช้งาน","default":"ok"},"template_found":{"type":"boolean","title":"Template Found","description":"พบไฟล์แม่แบบ .docx หรือไม่"}},"type":"object","required":["template_found"],"title":"HealthResult"},"OptionsResult":{"properties":{"vehicles":{"items":{"type":"string"},"type":"array","title":"Vehicles","description":"ทะเบียนรถที่ใช้บ่อย"},"vehicles_detail":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Vehicles Detail","description":"รายละเอียดรถและทะเบียน"},"drivers":{"items":{"type":"string"},"type":"array","title":"Drivers","description":"รายชื่อพนักงานขับรถ"},"approvers":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Approvers","description":"รายชื่อผู้อนุมัติพร้อมตำแหน่ง"},"approver_titles":{"items":{"type":"string"},"type":"array","title":"Approver Titles","description":"ตำแหน่งผู้อนุมัติที่ใช้ได้"},"requesters":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array","title":"Requesters","description":"รายชื่อผู้ขอใช้รถพร้อมตำแหน่ง"}},"type":"object","title":"OptionsResult","description":"Suggested master values (vehicles, drivers, approvers, requesters)."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VehicleRequestCreate":{"properties":{"requester_name":{"type":"string","maxLength":120,"minLength":2,"title":"Requester Name","description":"ชื่อ-สกุลผู้ขอใช้รถ รวมคำนำหน้า (ผู้ขออนุญาต) เช่น 'นายประพันธ์พงษ์ คงศรีรอด'"},"requester_position":{"type":"string","maxLength":120,"minLength":2,"title":"Requester Position","description":"ตำแหน่งของผู้ขอใช้รถ เช่น 'นักวิชาการคอมพิวเตอร์ชำนาญการ'"},"approver_name":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Approver Name","description":"ชื่อ-สกุลผู้อนุมัติ (ไม่บังคับ: หากไม่ส่งหรือส่งค่าว่าง จะเว้นเส้นประว่างไว้ให้ผู้อนุมัติลงนามด้วยมือตามแบบฟอร์มจริง)"},"approver_title":{"anyOf":[{"type":"string","maxLength":160},{"type":"null"}],"title":"Approver Title","description":"ตำแหน่งของผู้อนุมัติ (ไม่บังคับ: หากไม่ส่งหรือส่งค่าว่าง จะเว้นเส้นประว่างไว้ให้กรอกด้วยมือ)"},"driver_name":{"type":"string","maxLength":120,"minLength":2,"title":"Driver Name","description":"ชื่อ-สกุลพนักงานขับรถ (แสดงในหมายเหตุ 'ชื่อผู้ขับขี่') เช่น 'นายภาคิน กรณ์ธนกฤติ' หรือ 'นายประพันธ์พงษ์ คงศรีรอด'"},"license_plate":{"type":"string","maxLength":40,"minLength":2,"title":"License Plate","description":"หมายเลขทะเบียนรถ รวมจังหวัด เช่น '2กย 9703 กทม.' หรือ 'ฮฐ 9343 กทม.'"},"purpose":{"type":"string","maxLength":350,"minLength":2,"title":"Purpose","description":"วัตถุประสงค์การเดินทาง (ต่อจากคำว่า 'เพื่อ') เช่น 'เข้าร่วมประชุมสัมมนา...'"},"destination":{"type":"string","maxLength":200,"minLength":2,"title":"Destination","description":"สถานที่ปลายทาง เช่น 'โรงแรมอัศวิน กรุงเทพ'"},"passenger_count":{"type":"integer","maximum":99.0,"minimum":1.0,"title":"Passenger Count","description":"จำนวนคนนั่งในรถ (ค่าต่ำสุด 1)","default":1},"request_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Request Date","description":"วันที่ทำเอกสาร รูปแบบ YYYY-MM-DD หรือ DD/MM/YYYY (ค.ศ. หรือ พ.ศ. ก็ได้) ถ้าไม่ระบุใช้วันที่ปัจจุบัน (เขต Asia/Bangkok)"},"depart_date":{"type":"string","format":"date","title":"Depart Date","description":"วันที่ออกเดินทาง รูปแบบ YYYY-MM-DD หรือ DD/MM/YYYY (ค.ศ. หรือ พ.ศ. ก็ได้) เช่น '2026-10-20'"},"depart_time":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","title":"Depart Time","description":"เวลาออกเดินทาง 24 ชม. รูปแบบ HH:MM เช่น '08:30' (ระบบจะแปลงเป็น 08.30 น. อัตโนมัติ)","default":"08:30"},"return_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Return Date","description":"วันที่เดินทางกลับ YYYY-MM-DD ถ้าไม่ระบุใช้วันเดียวกับวันออกเดินทาง ต้องไม่ก่อนวันออกเดินทาง"},"return_time":{"anyOf":[{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},{"type":"null"}],"title":"Return Time","description":"เวลาเดินทางกลับ HH:MM จำเป็นต้องระบุ เว้นแต่ return_until_finished = true"},"return_until_finished":{"type":"boolean","title":"Return Until Finished","description":"true = พิมพ์คำว่า 'จนแล้วเสร็จ' ในช่องเวลากลับ (ไม่ระบุเวลากลับ)","default":false}},"type":"object","required":["requester_name","requester_position","driver_name","license_plate","purpose","destination","depart_date"],"title":"VehicleRequestCreate","description":"Payload for generating a \"แบบ ๓ ใบขอใช้รถยนต์ส่วนกลาง\" Word document.","examples":[{"approver_name":"","approver_title":"","depart_date":"2026-10-20","depart_time":"08:30","destination":"โรงแรมอัศวิน กรุงเทพ","driver_name":"นายประพันธ์พงษ์ คงศรีรอด","license_plate":"2กย 9703 กทม.","passenger_count":2,"purpose":"เข้าร่วมประชุมสัมมนา “digital infrastructure for the future” โครงการจัดทำนโยบายส่งเสริมการลงทุนโครงสร้างพื้นฐานด้านดิจิทัลและอวกาศ","request_date":"2026-10-20","requester_name":"นายประพันธ์พงษ์ คงศรีรอด","requester_position":"นักวิชาการคอมพิวเตอร์ชำนาญการ","return_date":"2026-10-20","return_until_finished":true}]}},"securitySchemes":{"APIKeyHeader":{"type":"apiKey","description":"จำเป็นเมื่อกำหนดตัวแปรสภาพแวดล้อม VEHICLE_REQUEST_API_KEY","in":"header","name":"X-API-Key"}}},"servers":[{"url":"/vehicle-request"}]}