PRD: Giá vốn
| Module | Kho | PRD ID | PRD-VAL-001 |
| Trạng thái | Chưa tạo item | FEAT | VAL |
| Epic | — | Plane | — |
| Ngày | 2026-07-13 | Phiên bản | v1.0 |
| Gói | @nx/inventory | URD | VAL |
| Surface | BackendClient · Chủ/QL | ||
| Phụ trách | Phát Nguyễn | ||
Giá vốn là gì
Giá vốn (Cost) là số tiền một đơn vị hàng đang nằm trong kho đáng giá. Bán ra, lấy giá bán trừ giá vốn là ra lãi gộp.
Mỗi mặt hàng của một chi nhánh (Merchant) có đúng một giá vốn, dùng chung cho mọi kho (InventoryLocation) của chi nhánh đó. Nhiều chi nhánh cùng nằm trong một tổ chức (Organizer), và mỗi chi nhánh giữ giá vốn của riêng mình. Chuyển hàng từ kho tổng sang quầy bán chỉ dịch chuyển số lượng, tiền không đổi.
Bốn chỉ số trong tồn kho
Trích từ Kho & mức tồn để khỏi phải mở PRD khác. Mỗi mặt hàng ở mỗi kho mang bốn con số:
| Con số | Hệ thống gọi | Nghĩa |
|---|---|---|
| Thực có | on-hand | Hàng đang nằm trong kho |
| Đang giữ | reserved | Đã hứa cho một chứng từ khác, không bán cho ai được nữa |
| Khả dụng | available | Phần còn bán được |
| Đang về | incoming | Đã rời kho gửi, chưa tới kho nhận |
Bất biến, đúng ở mọi thời điểm:
Khả dụng = Thực có - Đang giữMẫu số của phép bình quân gia quyền là tổng thực có của cả chi nhánh, cộng dồn từ mọi kho.
Vì sao một ô gõ tay không giải được bài toán này
Merchant nhập cùng một mặt hàng nhiều đợt và giá mỗi đợt một khác: thùng sữa tháng trước 22.000đ một hộp, tháng này 24.000đ. Hệ thống không tự gộp các đợt nhập lại thành một con số thì chủ quán phải tính tay trên giấy, và mọi báo cáo lãi lỗ sai từ gốc.
Một ô cho chủ quán tự gõ giá vốn tay cũng không giải được. Con số gõ tay đứng yên kể cả khi hàng nhập về với giá khác hẳn, nên càng dùng lâu càng lệch xa giá mua thật, và lãi tính khi bán ra trôi theo.
Vì vậy hệ thống giữ song song hai con số: giá bình quân gia quyền do hệ thống tự tính, và giá định mức do chủ quán tự gõ. Chủ quán chọn dùng con số nào cho từng mặt hàng.
Một mặt hàng, từ đầu tới cuối
Sữa tươi. Kho đang trống. Nhập hai đợt với hai giá, bán hết, rồi nhập lại.
| Việc xảy ra | Thực có | Giá trị tồn | Giá bình quân |
|---|---|---|---|
| Nhập 100 hộp, giá 20.000đ | 100 | 2.000.000đ | 20.000đ |
| Bán 40 hộp | 60 | 1.200.000đ | 20.000đ |
| Nhập 40 hộp, giá 25.000đ | 100 | 2.200.000đ | 22.000đ |
| Bán nốt 100 hộp, tồn về 0 | 0 | 0đ | 22.000đ (đóng băng) |
| Nhập 50 hộp, giá 24.000đ | 50 | 1.200.000đ | 24.000đ (thay hoàn toàn) |
- Bán hàng không làm đổi giá vốn. Giá vốn chỉ đổi ở lúc nhập hàng: (1.200.000 + 40 × 25.000) chia 100 bằng 22.000đ.
- Tồn về 0 thì giá cũ đóng băng, giữ nguyên 22.000đ. Hệ thống không chia cho 0 và không trả về giá 0đ.
- Lần nhập kế tiếp thay hoàn toàn giá cũ bằng đơn giá lô mới, vì không còn hàng cũ nào để trộn vào.
- Mặt hàng này đang chạy giá định mức 21.000đ thì lãi gộp lúc bán tính theo 21.000đ, còn cột giá bình quân vẫn chạy nền đúng như bảng trên.
Chỗ dễ sai nhất
Bật tách giá vốn theo địa điểm là một chiều, không tắt lại được
Merchant nhập hàng phân tán ở nhiều kho bật được cấu hình nâng cao để mỗi cặp mặt hàng và kho có giá vốn riêng.
Bật lên là chia một con số thành nhiều con số. Gộp ngược lại thì không có luật nào đúng: trung bình theo số lượng, hay lấy kho nào làm chuẩn, đều sai với một merchant nào đó. Vì vậy hệ thống không cho tắt. Form cảnh báo rõ điều này trước khi bật.
Mặc định thì giá vốn là một con số cho cả chi nhánh, và đó là lựa chọn đúng với hầu hết merchant.