add_passenger_fee
Thêm phí ghế, hành lý hoặc phí khác cho một hành khách trên một chặng và thu khoản phí đó. Với
user_request_id và user_request_fee_id, đây cũng là cách admin áp dụng một khoản phí của user
request RESOLVED — bước cuối của luồng user request. Mỗi khoản
phí của một yêu cầu được áp dụng bằng một lần gọi riêng.
Đây là một GraphQL mutation trả về Passenger, và cần role ADMIN.
Input
input: AddPassengerFeeInput!
| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
booking_history_id | String | Có | Booking cần thêm phí. |
fee_type | FeeType | Có | BAGGAGE, SEAT hoặc OTHER. Với khoản phí của user request, phải đúng loại của khoản đó. |
departure_eticket_id | String | Một trong hai | E-ticket của hành khách ở chặng đi. |
arrival_eticket_id | String | Một trong hai | E-ticket của hành khách ở chặng về. |
baggage | AddBaggageInput | Khi BAGGAGE, không kèm user request | Hành lý cần thêm. |
seat | SeatInput | Khi SEAT, không kèm user request | Ghế cần thêm. |
other_fee | OtherFeeInput | Khi OTHER, không kèm user request | Khoản phí cần thêm. |
user_request_id | String | Không | User request RESOLVED có khoản phí cần áp dụng. Cần kèm user_request_fee_id. |
user_request_fee_id mới | String | Khi có user_request_id | Khoản phí của yêu cầu đó cần áp dụng. Mỗi khoản chỉ áp dụng được một lần. |
E-ticket xác định cả hành khách lẫn chặng. Nếu gửi cả hai, e-ticket chặng đi được dùng.
Áp dụng khoản phí của user request
Khoản phí chỉ được chấp nhận khi thỏa tất cả điều kiện sau:
- Yêu cầu ở trạng thái
RESOLVED. - Thuộc cùng booking với
booking_history_id, và cùng hành khách với e-ticket. - Khoản phí thuộc
feescủa yêu cầu, chưapaid, và đúng chặng của e-ticket. fee_typeđúng loại của khoản phí.
Khi đó, API hoạt động khác đi:
| Không kèm user request | Kèm khoản phí của user request | |
|---|---|---|
| Dữ liệu ghế / hành lý / phí khác | Bắt buộc; quyết định thứ được thêm | Lấy từ khoản phí; baggage, seat và other_fee trong input bị bỏ qua |
| Thu của công ty | Giá của khoản phí | corporate_amount của khoản phí, đổi sang VND (0 nghĩa là không thu) |
| Giá booking tăng thêm | Giá của khoản phí | Toàn bộ price của khoản phí |
| Sau đó | Không có gì mới | Khoản phí thành paid, và khoản thanh toán được thêm vào extra_purchase_ids của nó |
Phần của người yêu cầu (price - corporate_amount) đã được thanh toán bằng
begin_personal_payment, trước khi phê duyệt.
mutation {
add_passenger_fee(input: {
booking_history_id: "..."
fee_type: SEAT
departure_eticket_id: "..."
user_request_id: "3JMY..."
user_request_fee_id: "3Jwm...seat"
}) { id }
}
Khi thanh toán thất bại
Nếu thanh toán bị từ chối, khoản phí vẫn chưa thanh toán và admin có thể thử lại. Mã lỗi của chính
store service được trả về, ví dụ not_enough khi số dư công ty không đủ.
Nếu không kết nối được tới dịch vụ thanh toán, API trả về payment_unreachable và khoản phí vẫn
được đánh dấu là đã thanh toán, vì có thể tiền đã bị trừ. Hãy hỏi đội backend trước khi thử lại.
Mã lỗi
Mã lỗi của khoản phí user request:
| Mã lỗi | Ý nghĩa |
|---|---|
user_request_not_found | user_request_id không tồn tại. |
<status>_user_request | Yêu cầu không ở RESOLVED — ví dụ confirmed_user_request. |
user_request_fee_id_required | Gửi user_request_id mà không có user_request_fee_id. |
user_request_fee_not_found | Khoản phí không thuộc các khoản của yêu cầu. |
paid_user_request_fee | Khoản phí đã được áp dụng. |
user_request_fee_type_mismatch | fee_type không đúng loại của khoản phí. |
user_request_booking_mismatch | Yêu cầu thuộc booking khác. |
user_request_passenger_mismatch | Yêu cầu dành cho hành khách khác. |
user_request_leg_mismatch | Khoản phí thuộc chặng còn lại. |
payment_unreachable | Dịch vụ thanh toán không phản hồi; có thể tiền đã bị trừ. |
Mã lỗi của chính khoản phí:
| Mã lỗi | Ý nghĩa |
|---|---|
MISSING_DEPARTURE_ARRIVAL_ETICKET_ID | Không gửi e-ticket id nào. |
not_found | booking_history_id không tồn tại. |
INVALID_ETICKET_ID | Không hành khách nào trong booking có e-ticket đó. |
missing_fee_data | Thiếu input tương ứng với fee_type — baggage, seat hoặc other_fee. |
invalid_transaction_time | transaction_time nằm trong tương lai. |
invalid_data | Hành lý không lớn hơn hành lý hành khách đang có ở chặng đó. |
already_has_seat | Hành khách đã có ghế ở chặng đó. |
API này cũng có thể trả về Lỗi middleware.