Assign khoá học
Assign khoá học
Gán một hoặc nhiều khoá học cho nhân sự trong cùng một lần gọi (batch). Thao tác **auto-confirm** (không cần bước xác nhận riêng) và **idempotent theo từng item** (nhân sự đã được assign khoá đó sẽ tự bỏ qua, không tính phí lần hai).
**Body params:**
| Param | Bắt buộc | Kiểu | Mô tả |
|-------|----------|------|-------|
| `items` | Có | array (1–100) | Danh sách cặp khoá – nhân sự cần assign |
| `items[].course_id` | Có | int | ID khoá học (theo `course_id` platform ở endpoint danh mục) |
| `items[].employer_id` | Có | int | ID nhân sự |
| `deadline` | Không | date | Hạn hoàn thành áp cho các item trong batch |
| `idempotency_key` | Không | string (max 64) | Không bắt buộc tự sinh. Nếu gửi, hệ thống hỗ trợ replay: cùng key đã xử lý sẽ trả lại kết quả cũ thay vì tạo/tính phí lại (kể cả khi hai request cùng key chạy đồng thời) |
**Hành vi:**
- Lỗi ở **mức order** (còn hoá đơn chưa thanh toán, thiếu credit…) sẽ làm **fail toàn bộ batch** và trả về mã lỗi tương ứng.
- Nếu order hợp lệ, từng item được xử lý độc lập với trạng thái riêng.
**Response gồm:** `order_id`, `status` (`assigned` khi tạo order thành công), `amount` (tổng phí), `invoice_id`, `replayed` (true nếu là kết quả replay theo idempotency_key), `summary` (`total` / `valid` / `invalid`), và `items[]` — mỗi item có `course_id`, `employer_id`, `status` (`assigned`, `skipped_already_assigned`, `invalid_employer`, `invalid_course`), `status_text` (diễn giải).
Request
This endpoint expects an object.
items
deadline
idempotency_key