PRD: Nhà cung cấp
| Module | Kho | PRD ID | PRD-VEN-001 |
| Trạng thái | Đã thay thế | FEAT | VEN |
| Epic | — | Plane | — |
| Ngày | 2026-07-13 | Phiên bản | v1.0 |
| Gói | @nx/inventory | URD | VEN |
| Surface | Client · Chủ/QLBO · Vận hành | ||
| Phụ trách | Phát Nguyễn | ||
Nhà cung cấp là gì
Một chi nhánh (Merchant) mua hàng từ nhiều nơi. Nhà cung cấp (Vendor) là hồ sơ của một bên bán hàng cho chi nhánh đó: tên, mã số thuế, địa chỉ, tiền tệ giao dịch và danh sách người liên hệ.
Biết tên nhà cung cấp là chưa đủ để lập một đơn mua hàng đúng. Vì vậy mỗi cặp nhà cung cấp - mặt hàng (VendorItem) là một bản ghi riêng, mang toàn bộ dữ liệu mua hàng của mặt hàng đó ở chính nhà cung cấp đó: đơn vị đặt hàng, số lượng đặt tối thiểu, thời gian giao, giá bậc, mã hàng của họ, và giá lần nhập gần nhất.
Hệ số quy đổi nằm ở mặt hàng, không nằm ở nhà cung cấp
Trích từ Đơn vị tính & quy đổi để khỏi phải mở PRD khác. Mỗi mặt hàng có một đơn vị gốc - đơn vị nhỏ nhất, và toàn bộ tồn kho luôn lưu theo đơn vị này. Hệ số quy đổi ("1 thùng = 24 hộp") là thuộc tính bất biến của đơn vị trên chính mặt hàng đó.
Dòng nhà cung cấp không mang hệ số của riêng nó. Nó chỉ trỏ vào một đơn vị đã khai trên mặt hàng. Nhờ vậy hai nhà cung cấp không thể bất đồng về việc một thùng bằng bao nhiêu.
Vì sao giá mua không nằm trên mặt hàng
Cùng một thùng sữa, mỗi nhà cung cấp một giá, một số lượng đặt tối thiểu, một thời gian giao khác nhau. Cùng một nhà cung cấp thì mỗi mặt hàng lại có quy cách đóng gói riêng. Không có chỗ lưu những con số này thì chủ merchant phải nhớ trong đầu hoặc lật lại tin nhắn Zalo mỗi lần đặt hàng, và nhân viên mới thì không đặt nổi.
Giá mua cũng không phải giá bán. Giá bán ra cho khách nằm ở module Định giá và đi theo biến thể sản phẩm. Giá mua vào đi theo cặp nhà cung cấp - mặt hàng, và cùng một mặt hàng mua ở hai nơi thì có hai giá. Trộn hai thứ này vào một chỗ là nguồn gốc của mọi con số lãi lỗ sai.
Một mặt hàng, hai nhà cung cấp, từ đầu tới cuối
Nguyên vật liệu "Sữa tươi", đơn vị gốc là hộp. Nhà cung cấp A bán theo Thùng 24, nhà cung cấp B bán theo Thùng 12.
| Việc xảy ra | Giá đề xuất trên dòng hàng | Giá lần nhập gần nhất của A | Tồn Sữa tươi |
|---|---|---|---|
| Gán Sữa tươi cho A, khai giá bậc: từ 10 thùng 50.000đ, từ 50 thùng 46.000đ | - | chưa có | 0 hộp |
| Lập đơn mua 12 thùng của A | 50.000đ (bậc từ 10) | chưa có | 0 hộp |
| Nhận hàng, giá thật là 55.000đ | - | 55.000đ | 288 hộp |
| Lập đơn mua 5 thùng của A, không bậc nào khớp | 55.000đ (giá lần nhập gần nhất) | 55.000đ | 288 hộp |
| Lập đơn mua 2 thùng của B, mặt hàng chưa gán cho B | để trống, merchant tự nhập | 55.000đ | 288 hộp |
| Nhận hàng của B | - | 55.000đ | 312 hộp |
- 12 thùng của A ra 288 hộp (12 x 24). 2 thùng của B ra 24 hộp (2 x 12). Hệ số lấy từ đơn vị trên mặt hàng, không phải từ dòng nhà cung cấp.
- Giá lần nhập gần nhất được ghi lúc nhận hàng, không phải lúc đặt hàng. Đặt 50.000đ mà nhận về 55.000đ thì con số lưu lại là 55.000đ, vì đó mới là số tiền thật sự trả.
- Giá bậc thắng nếu số lượng đang đặt khớp một bậc. Không bậc nào khớp thì dùng giá lần nhập gần nhất.
- Bản ghi của A và của B tồn tại song song, mỗi bản ghi giữ giá riêng của mình.
Chỗ dễ sai nhất
Nhà cung cấp bán quy cách khác thì khai một đơn vị mới, không sửa hệ số cũ
Nhà cung cấp B bán thùng 12 hộp trong khi Thùng của mặt hàng đang là 24 hộp. Cách làm đúng là khai thêm một đơn vị Thùng 12 trên mặt hàng, rồi trỏ dòng nhà cung cấp B vào đơn vị đó.
Sửa hệ số của Thùng từ 24 xuống 12 là viết lại lịch sử: mọi lần nhập cũ của A đổi nghĩa. Hệ số bị khóa kể từ lúc mặt hàng có phát sinh kho.
Hệ quả: "5 thùng của nhà cung cấp này" luôn ra đúng một con số, kể cả lúc kiểm kê hay chuyển kho, là những lúc không còn biết hàng đến từ nhà cung cấp nào.