Giao diện
Phiếu mua dừa
Ai dùngQuản trị viên Quản lý Quản lý thu mua Nhân viên kho Nhân viên phân bổ & QC Nhân viên thu mua
Mỗi xe dừa trái có một phiếu mua dừa. Dịch vụ: receiving-ticket-service. Công thức các giá trị tính: Tính toán phiếu mua dừa.
Tạo phiếu
| Mã | Yêu cầu |
|---|---|
| FR-TKT-1 | Mọi phiếu phải thuộc một kế hoạch thu mua dừa trái tuần. Ngày giao hàng phải nằm trong 7 ngày của tuần kế hoạch, theo giờ ICT, cả khi tạo lẫn khi sửa (DELIVERY_DATE_OUTSIDE_PLAN_WEEK); portal chỉ cho chọn 7 ngày đó. Kế hoạch đã xoá: 404; kế hoạch cơm dừa: 400 PLAN_TYPE_MISMATCH. |
| FR-TKT-2 | Tạo từ dòng kế hoạch: hệ thống phải lấy NCC, sản phẩm, HTX và (Khoan ngoài) đối tác khoan từ dòng. Dòng Khoan ngoài chưa có đối tác khoan thì không tạo được. Người dùng nhập ngày giao, buổi, Biển số xe, nhân viên thu mua, ghi chú. |
| FR-TKT-3 | Phiếu tự do (không có dòng kế hoạch) phải có NCC, sản phẩm, quy trình, HTX, lý do phát sinh, ngày giao, biển số; Khoan ngoài phải có đối tác khoan đang có vai trò đối tác khoan. |
| FR-TKT-4 | Lý do phát sinh lấy từ danh mục, chỉ nhận mã đang hoạt động: Dời ngày, Đổi nhà cung cấp, Đổi đối tác khoan, Phát sinh ngoài kế hoạch, Chưa lập phiếu trước khi giao gia công. |
| FR-TKT-5 | Nhân viên thu mua của phiếu phải là người được phân công cho NCC (PURCHASER_NOT_ASSIGNED, cả khi tạo và khi sửa). Khi tạo mà không chọn ai, server tự điền: người tạo chỉ có quyền create:assigned là chính họ; người tạo khác nhận người được phân công duy nhất (đang hoạt động) của NCC, có nhiều hơn một thì để trống. |
| FR-TKT-6 | Phiếu mới có trạng thái Đang xử lý (in_progress). |
| FR-TKT-7 | Biển số được chuẩn hoá (viết hoa, bỏ ký tự khác chữ số, chữ cái, Đ) rồi phải khớp ^[0-9]{2}[A-ZĐ]{1,2}[1-9]?[0-9]{5}$ hoặc dạng cũ ^[0-9]{2}[A-ZĐ]{1,2}[0-9]{4}$. Sai: TRUCK_PLATE_INVALID. |
| FR-TKT-8 | Xe được đăng ký ở vendor-service nếu chưa có, rồi liên kết với NCC. Liên kết thất bại không được chặn việc tạo phiếu. |
| FR-TKT-9 | Trước khi tạo, portal phải kiểm tra phiếu trùng: cùng NCC, sản phẩm, quy trình, đối tác khoan, HTX, ngày giao (ICT) và biển số, trên mọi phạm vi. Có phiếu trùng thì hỏi lại; người dùng vẫn được tạo. |
Dữ liệu theo quy trình
Quy trình: outsourced_drilling (Khoan ngoài) hoặc inhouse_drilling (Khoan nội bộ).
| Trường | Ý nghĩa | Khoan ngoài | Khoan nội bộ |
|---|---|---|---|
purchaseGrossWeight | Tổng khối lượng nhận vào tại đối tác khoan | ✓ | — |
vendorDrillWaterWeight | Nước chiết xuất tại đối tác khoan | ✓ | — |
intakeGrossWeight | Tổng khối lượng đến công ty (lần cân 1) | ✓ | ✓ |
returnGrossWeight | Tổng khối lượng đi từ công ty (lần cân 2) | ✓ | ✓ |
purchasedCoconutCount | Số lượng trái dừa | — | ✓ |
supplementaryDrilledWeight | Khối lượng dừa khoan bổ sung | ✓ | — |
supplementaryDrilledCoconutCount | Số trái khoan bổ sung | ✓ | — |
gcfDrillWaterWeight | Nước chiết xuất tại công ty | ✓ | ✓ |
spoilDrilledWeight | Khối lượng hư đã khoan | ✓ | — |
spoilUndrilledWeight | Khối lượng hư chưa khoan | ✓ | ✓ |
sampleDrilledWeight | Mẫu 120 trái đã khoan (Khoan nội bộ: trọng lượng sau khoan) | ✓ | ✓ |
sampleUndrilledWeight | Mẫu 120 trái nguyên | — | ✓ |
sampleBrownMeatWeight | Cơm còn lớp nâu của mẫu | ✓ | ✓ |
qaCoconutCount | Số trái QA | ✓ | ✓ |
inboundSeals | Seal về nhà máy | ✓ | ✓ |
outboundSeals | Seal đi khoan | ✓ | — |
drillingVendorId | Đối tác khoan | ✓ | — |
| Mã | Yêu cầu |
|---|---|
| FR-TKT-10 | Gửi trường không thuộc quy trình của phiếu phải bị từ chối (400). drillingVendorId trên phiếu Khoan nội bộ: DRILLING_VENDOR_NOT_ALLOWED. |
| FR-TKT-11 | Gửi null là xoá giá trị; bỏ trường là giữ nguyên. Ô trống lưu null, không được lưu 0. Số 0 được tính là đã nhập. |
| FR-TKT-12 | purchasedCoconutCount, sampleDrilledWeight, sampleUndrilledWeight, sampleBrownMeatWeight, qaCoconutCount phải > 0. purchasedCoconutCount, supplementaryDrilledCoconutCount, qaCoconutCount phải là số nguyên (COCONUT_COUNT_NOT_WHOLE, details.field nêu trường); supplementaryDrilledCoconutCount ≥ 0. Mọi khối lượng còn lại phải ≥ 0. |
| FR-TKT-13 | returnGrossWeight phải nhỏ hơn intakeGrossWeight (RETURN_WEIGHT_NOT_BELOW_INTAKE). sampleBrownMeatWeight phải nhỏ hơn sampleDrilledWeight (SAMPLE_BROWN_MEAT_EXCEEDS_DRILLED). Khoan nội bộ: sampleDrilledWeight phải nhỏ hơn sampleUndrilledWeight (SAMPLE_DRILLED_EXCEEDS_UNDRILLED). |
| FR-TKT-14 | Mỗi chiều seal tối đa 20 seal, mỗi seal tối đa 100 ký tự; seal được cắt khoảng trắng, bỏ seal trống; trùng trong cùng danh sách bị từ chối. |
| FR-TKT-15 | Portal phải chặn số âm ở mọi ô khối lượng với thông báo Nhập một số hợp lệ không âm. |
Quyền sửa theo nhóm trường
PATCH /api/coconut-receiving-tickets/{id} yêu cầu quyền của mọi nhóm mà yêu cầu chạm tới.
| Nhóm | Trường | Quyền coconut-receiving-tickets: | Vai trò |
|---|---|---|---|
| Giao hàng | notes, truckPlate, inboundSeals, outboundSeals, deliveryDate | update-delivery | AD MG PM WS QC; PU phạm vi được giao |
| Thông tin phiếu | workflowType, cooperativeId, purchaserId, productId, drillingVendorId, lotNo | update-ticket | AD MG PM WS |
| Khối lượng tại đối tác | purchaseGrossWeight | update-processing-weights | AD MG PM WS |
| Cân tại công ty | truckScaleRecordId, intakeGrossWeight, returnGrossWeight, purchasedCoconutCount | update-company-weighing | AD MG PM WS QC |
| Nước tại đối tác | vendorDrillWaterWeight | update-vendor-drill-water | AD MG PM WS QC |
| Khoan bổ sung | supplementaryDrilledWeight, supplementaryDrilledCoconutCount, gcfDrillWaterWeight | update-supplementary-drilling | AD MG PM WS QC |
| Hư hỏng | spoilDrilledWeight, spoilUndrilledWeight | update-spoil-weights | AD MG PM WS QC |
| Lấy mẫu | sampleDrilledWeight, sampleUndrilledWeight, sampleBrownMeatWeight, qaCoconutCount | update-sample-weights | AD MG PM WS QC |
| Mã | Yêu cầu |
|---|---|
| FR-TKT-16 | Chạm nhóm không có quyền: 403 FIELDS_NOT_EDITABLE, không lưu gì. |
| FR-TKT-17 | Nhóm chỉ có quyền phạm vi assigned thì phiếu phải nằm trong phạm vi, nếu không trả 404 RECEIVING_TICKET_NOT_FOUND. |
| FR-TKT-18 | Người chỉ có phạm vi assigned đổi deliveryDate, truckPlate khi phiếu đã có liên kết cân xe hoặc bất kỳ số đo nào: thay đổi đó bị bỏ qua. Portal phải khoá hai ô với dòng Khoá sau khi đã có dữ liệu cân. |
Trạng thái
| Mã | Yêu cầu |
|---|---|
| FR-TKT-19 | Trạng thái phải được hệ thống tính lại sau mỗi lần ghi; không ai chọn tay. Không trường bắt buộc nào có giá trị: in_progress. Đủ hết: complete. Còn lại: pending_data. |
| FR-TKT-20 | Trường bắt buộc, Khoan ngoài: purchaseGrossWeight, vendorDrillWaterWeight, intakeGrossWeight, returnGrossWeight, gcfDrillWaterWeight, supplementaryDrilledWeight, supplementaryDrilledCoconutCount, spoilUndrilledWeight, spoilDrilledWeight, sampleDrilledWeight, sampleBrownMeatWeight, qaCoconutCount, processingBatchWeight. |
| FR-TKT-21 | Trường bắt buộc, Khoan nội bộ: intakeGrossWeight, purchasedCoconutCount, returnGrossWeight, gcfDrillWaterWeight, spoilUndrilledWeight, sampleUndrilledWeight, sampleDrilledWeight, sampleBrownMeatWeight, qaCoconutCount, processingBatchWeight. |
| FR-TKT-22 | Phiếu Hoàn thành khi đủ mọi trường bắt buộc (FR-TKT-20, FR-TKT-21), kể cả khi chưa phân bổ: processingBatchWeight (Tổng phân phối) có giá trị theo FR-CAL-4 từ trước khi phân bổ, và được tính lại theo dòng phân bổ (FR-CAL-5) khi có; phiếu vẫn Hoàn thành. |
Khoá theo phân bổ
Phiếu đã phân bổ khi: Khoan nội bộ có # Xe; Khoan ngoài có # Xe hoặc có ít nhất một dòng phân bổ. Hệ thống hỏi trực tiếp processing-allocation-service.
| Mã | Yêu cầu |
|---|---|
| FR-TKT-23 | Chỉ đổi được quy trình khi phiếu chưa có dữ liệu: chưa có số cân/số lượng nào, chưa liên kết phiếu cân, chưa có seal (vào/ra), chưa có ảnh (cân, seal), chưa nhập tay số lô. Có rồi: 409 WORKFLOW_LOCKED_BY_DATA. Gửi lại đúng quy trình hiện có thì không bị từ chối. Áp dụng cho cả phiếu theo kế hoạch lẫn phiếu tự do; phiếu theo kế hoạch có thể khác quy trình của dòng kế hoạch, báo cáo kế hoạch–thực tế tính theo quy trình của phiếu. Portal chỉ cho chọn Quy trình khi được đổi, ngược lại hiện chỉ để xem. |
| FR-TKT-24 | Không được xoá phiếu đang có thẻ xe trong Phân bổ sơ chế (đã đưa vào ngày, có hay chưa có # Xe, có hay chưa có dòng): 409 TICKET_ALLOCATED_DELETE_BLOCKED; Trả về trước rồi mới xoá. Xoá là xoá mềm và cần delete:all (AD, MG, PM). |
| FR-TKT-25 | Phiếu đang có thẻ xe trong Phân bổ sơ chế (có hay chưa có # Xe, có hay chưa có dòng) không đổi được quy trình: 409 WORKFLOW_LOCKED_BY_ALLOCATION; Trả về trước. Sang Khoan ngoài phải chọn đối tác khoan trong cùng lần lưu (400 DRILLING_VENDOR_REQUIRED_FOR_WORKFLOW; portal báo ngay dưới ô Đối tác khoan và không gửi); sang Khoan nội bộ thì bỏ đối tác khoan. |
Số lô
| Mã | Yêu cầu |
|---|---|
| FR-TKT-26 | Số lô tự sinh dạng {mã sản phẩm}-{yymmdd ngày phân bổ}[/{mã HTX}]-01, ví dụ DH-O-261007/LL-01. Hậu tố -01 cố định. |
| FR-TKT-27 | Số lô chỉ tồn tại khi thẻ xe của phiếu có # Xe; Trả về hoặc mất # Xe thì số lô bị xoá. |
| FR-TKT-28 | Số lô gõ tay được giữ nguyên (lotNoManual). Gửi số lô trống thì trả quyền sinh lại cho hệ thống. |
Liên kết cân xe
| Mã | Yêu cầu |
|---|---|
| FR-TKT-29 | Bản ghi gợi ý: chiều Nhập, cùng biển số xe của phiếu (so sau khi bỏ dấu phân cách), lần cân 1 hoặc 2 nằm trong ngày giao (ICT) cộng thời gian ân hạn (mặc định 24 giờ), đối tác của bản ghi là NCC, sản phẩm khớp sản phẩm phiếu (hoặc danh mục khi bản ghi chỉ ánh xạ tới nhóm hàng), chưa gắn với phiếu khác. Bản ghi chưa ánh xạ không được gợi ý. |
| FR-TKT-30 | Phiếu mua dừa gắn tối đa một bản ghi, bản ghi phải đã có lần cân 1. Khi gắn: intakeGrossWeight = lần cân 1, returnGrossWeight = lần cân 2 (có thể còn trống). |
| FR-TKT-31 | Khi đã gắn, không được sửa tay hai số cân. Bỏ liên kết (truckScaleRecordId: "") xoá cả hai số. |
| FR-TKT-32 | Đổi biển số hoặc ngày giao: liên kết tự bỏ và hai số cân bị xoá khi lưu. |
| FR-TKT-33 | Khi xe cân lần 2 sau khi đã gắn: hệ thống (người ghi system) phải điền returnGrossWeight nếu còn trống. Lần cân 2 không nhỏ hơn lần cân 1 thì để trống và ghi log. |
| FR-TKT-34 | Một bản ghi cân xe chỉ gắn được cho một phiếu (mua dừa hoặc mua cơm dừa): 409 TRUCK_SCALE_RECORD_CLAIMED. |
Tệp đính kèm
| Mã | Yêu cầu |
|---|---|
| FR-TKT-35 | Hai loại: Phiếu cân (weighing, tối đa 10 tệp) và Ảnh seal (seal, tối đa 40 tệp). Vượt: 409 ATTACHMENT_LIMIT_REACHED. |
| FR-TKT-36 | Chỉ nhận JPEG, PNG, WebP; mỗi tệp > 0 và ≤ 5 MB; tên tệp ≤ 255 ký tự. |
| FR-TKT-37 | Tải lên và xoá có hiệu lực ngay, không cần Lưu. Cần quyền manage-attachments với phạm vi tương ứng. |
Danh sách, lịch sử, xuất file
| Mã | Yêu cầu |
|---|---|
| FR-TKT-38 | Danh sách lọc theo khoảng ngày giao, tối đa 93 ngày (DATE_RANGE_TOO_LARGE); lọc nhiều giá trị theo quy trình, NCC, đối tác khoan, trạng thái, nhân viên thu mua, HTX. |
| FR-TKT-39 | Mỗi lần thêm, sửa phiếu phải ghi lịch sử kèm ảnh chụp dữ liệu trước và sau. Thêm, gỡ tệp đính kèm ghi tên người thêm, gỡ tệp. Lịch sử hiển thị bỏ các lần ghi của system. |
| FR-TKT-40 | Portal xuất Excel riêng cho Khoan ngoài và Khoan nội bộ theo khoảng ngày và bộ lọc đang chọn. |