Tóm tắt
Đề xuất có lưu nháp (tạo nháp → sửa → gửi đi), quy tắc liên kết cấu hình theo mẫu (mẫu nào được link tới,
số link tối thiểu/tối đa), và server kiểm tra kiểu trường int/date. Mẫu cũ không cấu hình quy tắc thì hành vi
link không đổi. Gửi lại sau khi bị trả lại vẫn duyệt lại từ đầu (REQUEST-016, không đổi).
Chi tiết
- Nháp (REQUEST-017):
POST /requests { ..., saveAsDraft: true }→status: "draft". Chưa tạo bước duyệt, chưa kiểm tra trường bắt buộc, không thông báo/webhook.linkedRequestIdsvàflexibleApproverPickschọn lúc gửi đi; gửi kèm khi lưu nháp → 400request.draft.submit_only_fields.PATCH /requests/:id/fieldssửa được nháp (thêm được trường của mẫu mà lúc lưu chưa điền).POST /requests/:id/submit { flexibleApproverPicks?, linkedRequestIds? }→ 200Request(pending). Kiểm tra đầy đủ như tạo thường.- Nháp chỉ người tạo thấy: không hiện ở
GET /requestscủa người khác;GET /requests/:idnháp của người khác → 404. Xem nháp của mình:GET /requests?view=sent-by-me&status=draft.
- Quy tắc link (REQUEST-018/019):
POST /request-templatesnhận thêmallowedLinkTemplateIds?: string[](rỗng = mẫu nào cũng được),minLinks?: number(mặc định 0),maxLinks?: number | null(null = không giới hạn). Template trả về có 3 trường này.- Tạo đề xuất sai số link → 400
request.create.link_count_out_of_range+details { min, max, count }; link tới đề xuất khác mẫu cho phép → 400request.create.link_template_not_allowed+details { linkedRequestId, allowedTemplateIds }. POST /requests/:id/clonenhận thêmlinkedRequestIds?cho bản sao.
- Kiểu trường (REQUEST-020):
int= số nguyên hoặc chuỗi số nguyên;date=YYYY-MM-DDhợp lệ. Sai → 400request.field.invalid_type+details { fieldKey, type }. Áp dụng khi tạo, sửa trường, nhập Excel.
Contract (trước → sau)
| Trước | Sau | |
|---|---|---|
POST /requests body |
— | + saveAsDraft?: boolean |
POST /requests/:id/submit |
— | mới, 200 Request |
PATCH /requests/:id/fields |
chỉ returned |
returned hoặc draft |
POST /request-templates body / RequestTemplate |
— | + allowedLinkTemplateIds, minLinks, maxLinks |
POST /requests/:id/clone body |
{ flexibleApproverPicks? } |
+ linkedRequestIds? |
| Lỗi mới | — | request.draft.*, request.create.link_count_out_of_range, request.create.link_template_not_allowed, request.template.link_range_invalid, request.field.invalid_type |
Việc bên nhận cần làm
- FE: nút "Lưu nháp" + tab "Đã lưu nháp" (hiện
FILTERABLE_STATUSESđang bỏdraft) + nút "Gửi đi" gọi/submit. - FE: form mẫu đề xuất thêm cấu hình mẫu được link tới và số link tối thiểu/tối đa; form tạo đề xuất hiển thị lỗi link theo
details. - FE: hiển thị lỗi
request.field.invalid_typengay ở trườngdetails.fieldKey.
Cách kiểm tra
- Tạo nháp thiếu trường bắt buộc → 201
draft;/submit→ 400request.create.missing_required_field; điền đủ quaPATCH /fields→/submit200pending. - Tạo mẫu
{ allowedLinkTemplateIds: [<mẫu CẤP>], minLinks: 1, maxLinks: 1 }→ tạo đề xuất không link → 400link_count_out_of_range.