PRD: Chuyển kho
| Module | Kho | PRD ID | PRD-TRF-001 |
| Trạng thái | Chưa tạo item | FEAT | TRF |
| Epic | — | Plane | — |
| Ngày | 2026-07-14 | Phiên bản | v1.0 |
| Gói | @nx/inventory | URD | TRF |
| Surface | Client · Chủ/QL | ||
| Phụ trách | Phát Nguyễn | ||
Chuyển kho là gì
Một chi nhánh (Merchant) có thể có nhiều kho (InventoryLocation): kho tổng, quầy bán, bếp. Nhiều chi nhánh cùng nằm trong một tổ chức (Organizer).
Phiếu chuyển kho (Transfer Ticket) là chứng từ ghi lại một lần hàng đi từ kho này sang kho khác: đi từ kho nào, tới kho nào, ai xuất, ai nhận, và hao hụt bao nhiêu.
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ữVì sao chuyển kho không phải một phép cộng trừ
Hàng không tới ngay. Rời kho gửi sáng nay, chiều mai mới tới kho nhận. Khoảng giữa đó, hàng không nằm ở kho nào cả.
- Trừ kho gửi và cộng kho nhận cùng lúc: kho nhận bán ra số hàng chưa có trên kệ.
- Chỉ trừ kho gửi, chưa cộng kho nhận: hàng biến mất khỏi sổ suốt lúc đang đi.
Vì vậy chuyển kho là một quá trình nhiều chặng, mỗi chặng có chứng từ riêng.
Một chuyến hàng, từ đầu tới cuối
Chuyển 100 lon từ kho A sang kho B. Xuất làm hai chuyến. Chuyến hai hao 2 lon.
| Việc xảy ra | Thực có A | Đang giữ A | Đang về B | Thực có B |
|---|---|---|---|---|
| Lập phiếu, chưa duyệt | 100 | 0 | 0 | 0 |
| Duyệt | 100 | 100 | 0 | 0 |
| Xuất chuyến 1: 60 lon | 40 | 40 | 60 | 0 |
| Kho B nhận đủ 60 | 40 | 40 | 0 | 60 |
| Xuất chuyến 2: 40 lon | 0 | 0 | 40 | 60 |
| Kho B đếm được 38 | 0 | 0 | 0 | 98 |
- Đang giữ ở kho gửi là phần đã duyệt mà chưa xuất. Xuất hết thì về 0.
- Đang về ở kho nhận là tổng đã xuất trừ tổng đã nhận. Nhận đủ thì về 0.
- Kho nhận không bán được phần đang về. Hàng phải tới nơi, đếm thật, mới thành khả dụng.
Chỗ dễ sai nhất
Hàng đã rời kho gửi thì không thể im lặng biến mất
Xuất 40, kho B đếm được 38. Hai lon đó đã ra khỏi kho A, không kéo về được.
Người lập phải đóng phiếu. Đóng phiếu sinh một phiếu điều chỉnh ghi 2 lon thất thoát kèm lý do. Mất hàng thì phải có chứng từ ghi nhận việc mất.
Hệ quả: phiếu đã hoàn tất thì không sửa, không xóa. Ghi sai thì lập phiếu mới bù vào. Sổ kho chỉ được ghi thêm.
1. Mục tiêu & Loại trừ
Mục tiêu
- Cho phép lập một phiếu chuyển chọn đủ cặp merchant - kho ở cả hai đầu, và bắt buộc phải có đầu nhận.
- Cho phép chuyển hàng giữa hai merchant khác nhau, và chạy chuyển hàng trong cùng một merchant bằng đúng mô hình đó.
- Cho một phiếu cha nhận nhiều phiếu xuất và nhiều phiếu nhập, để chuyển làm nhiều chuyến và nhận làm nhiều lần là chuyện bình thường.
- Suy trạng thái phiếu cha từ các phiếu con, và hiển thị bằng chữ của nghiệp vụ chuyển kho.
- Làm cho phần đang giữ ở kho nguồn và phần đang về ở kho đích luôn đúng, vì chúng được tính từ chính các phiếu con chứ không phải một cột phải nhớ cập nhật.
- Cho phép ghi đúng hàng thật: xuất vượt kế hoạch, nhận vượt số đã xuất đều không bị chặn.
- Tách rạch ròi đóng phiếu (có hàng mất, sinh phiếu điều chỉnh) khỏi hủy phiếu (không có hàng nào mất), và không cho hàng đang trên đường biến mất im lặng.
- Cho mỗi người thấy đúng việc của mình: người lập thấy một dòng, thủ kho merchant đích thấy một việc nhận hàng.
Loại trừ
- Khung vòng đời phiếu kho, quan hệ cha-con và luật chỉ-ghi-thêm ở mức chung (thuộc TKT); PRD này chỉ nói phần riêng của chuyển kho.
- Hàng đã đặt nhà cung cấp nhưng chưa về: đó là một khái niệm khác, thuộc Đơn mua hàng, không cộng vào số đang về.
- Điều phối vận chuyển, chi phí vận chuyển, tài xế, biển số xe.
- Tính lại giá vốn theo từng địa điểm: giá vốn là một con số cho cả merchant, xem Giá vốn.
2. Thước đo thành công
| Thước đo | Mục tiêu / tín hiệu |
|---|---|
| Bán quá tay do hàng đang trên đường | Không còn trường hợp kho đích khả dụng hàng chưa nhận, hoặc kho nguồn bán mất phần đã hứa cho phiếu chuyển |
| Độ khớp bốn con số | Tổng thực có hai kho cộng số đang về luôn khớp với số hàng thật ở mọi thời điểm của phiếu |
| Hàng thất lạc luôn có chứng từ | Mọi phần đã xuất mà không tới nơi đều có một phiếu điều chỉnh ghi thất thoát kèm lý do |
| Chuyển nhiều chuyến không cần lách | Merchant chuyển làm nhiều đợt trên một phiếu duy nhất, thay vì lập nhiều phiếu rời rạc |
| Mức dùng của phiếu chuyển | Merchant nhiều kho chuyển hàng qua phiếu thay vì tự sửa tay tồn ở hai màn hình |
3. Persona & Tình huống
| Persona | Mục tiêu trong tính năng này |
|---|---|
| Owner / Manager | Lập phiếu chuyển, theo dõi hàng đang trên đường, đóng phiếu khi hàng không về đủ |
| Thủ kho merchant nguồn | Soạn hàng theo phiếu, ghi phiếu xuất cho từng chuyến, biết chính xác còn phải xuất bao nhiêu |
| Thủ kho merchant đích | Nhận đúng một việc "nhận hàng", đếm hàng thật rồi ghi phiếu nhập cho từng lần |
| Thu ngân | Không bán nhầm phần hàng đã hứa cho phiếu chuyển, cũng không bán phần hàng chưa tới nơi |
Kịch bản cốt lõi: quản lý lập phiếu chuyển 100 lon từ Merchant A - Kho mặc định sang Merchant B - Kho mặc định → duyệt xong, phiếu hiện "Chờ chuyển" và kho nguồn giữ 100 lon nên khả dụng giảm 100 → thủ kho Merchant A xuất chuyến đầu 60 lon, phiếu sang "Đang chuyển", kho đích thấy 60 lon đang về → thủ kho Merchant B nhận đủ 60 → chuyến hai xuất nốt 40 lon, bên nhận chỉ đếm được 38 → quản lý bấm đóng phiếu, hệ thống sinh một phiếu điều chỉnh ghi 2 lon thất thoát kèm lý do.
4. User Stories
| # | Là một | Tôi muốn | Để |
|---|---|---|---|
| 01 | quản lý | lập một phiếu chuyển chọn rõ merchant và kho ở cả hai đầu | không bao giờ có chuyện hàng đi mà không biết đi về đâu |
| 02 | quản lý | chuyển hàng sang một merchant khác trong cùng organizer | rót hàng giữa các điểm bán mà không phải lách bằng cách sửa tay tồn hai nơi |
| 03 | thủ kho merchant nguồn | xuất hàng làm nhiều chuyến trên cùng một phiếu | chở đủ một xe thì đi, không phải chờ gom đủ |
| 04 | thủ kho merchant đích | thấy đúng một việc của mình là "nhận 20 lon từ Merchant A" | không phải đọc chứng từ của người khác |
| 05 | thu ngân tại kho nguồn | hàng đã hứa cho phiếu chuyển bị khóa lại ngay, không bán ra được nữa | tôi không bán mất phần đã hứa cho kho khác |
| 06 | thủ kho merchant đích | thấy số hàng đang về trên màn tồn kho nhưng không khả dụng | tôi biết hàng sắp tới mà không lỡ bán trước |
| 07 | quản lý | ghi đúng số hàng thật kể cả khi nó vượt kế hoạch | sổ sách phản ánh chuyện đã xảy ra |
| 08 | quản lý | đóng phiếu khi biết chắc hàng không về nữa | phần mất được ghi thành thất thoát có lý do thay vì treo mãi |
| 09 | quản lý | hủy một phiếu khi hàng chưa đi | phần tồn đang giữ trở lại khả dụng ngay |
5. Yêu cầu chức năng
| # | Yêu cầu | Trạng thái | URD ref |
|---|---|---|---|
FR-001 | Người phụ trách kho lập một phiếu chuyển kho (Transfer Ticket) tại trang Client. • Mỗi bên khai rõ chi nhánh (Merchant) nào, kho (InventoryLocation) nào - hai kho có thể thuộc hai chi nhánh khác nhau. • Kho nhận là bắt buộc. Không có kho nhận thì phiếu không lưu được. • Ít nhất một mặt hàng, kèm đơn vị tính và số lượng lớn hơn 0. Lý do và ghi chú là tùy chọn. • Lưu xong, phiếu mang một mã riêng; cả hai bên đều tra cứu được. | 🚧 | URD-TRF-001 |
FR-002 | Chuyển giữa hai chi nhánh (Merchant) hay chuyển trong cùng một chi nhánh đều chạy giống nhau. • Khác merchant: mỗi bên giữ phiếu con của mình. • Cùng merchant: cả hai phiếu con cùng thuộc merchant đó. • Người dùng không phải chọn kiểu chuyển. Khai hai kho là đủ; hệ thống không có trường hợp đặc biệt nào. | 🚧 | URD-TRF-002 |
FR-003 | Phiếu chuyển đi đủ năm bước của vòng đời phiếu kho, chỉ đổi chữ hiển thị cho hợp nghề. • Nháp và Đã gửi giữ nguyên chữ. • Đã duyệt hiện là Chờ chuyển. Đang thực hiện hiện là Đang chuyển. Hoàn tất hiện là Đã nhận. • Chỉ đổi chữ hiển thị, không phát sinh thêm trạng thái nào. | 🚧 | URD-TRF-003 · URD-TKT-004 |
FR-004 | Trạng thái phiếu chuyển do các phiếu con quyết định. Màn chi tiết không có nút nào để tự đặt trạng thái bằng tay. | 🚧 | URD-TRF-004 |
FR-005 | Hàng được xuất làm nhiều chuyến. Mỗi chuyến là một phiếu xuất. • Thủ kho bên gửi bấm Xuất hàng, nhập số của chuyến này, hoàn tất. • Phiếu xuất thuộc merchant gửi, chỉ có hai bước: Nháp và Hoàn tất. • Hoàn tất thì thực có kho gửi giảm ngay, sổ biến động ghi một dòng. | 🚧 | URD-TRF-005 |
FR-006 | Hàng được nhận làm nhiều lần. Mỗi lần là một phiếu nhập. • Thủ kho bên nhận bấm Nhận hàng, nhập số đếm được thật, hoàn tất. • Phiếu nhập thuộc merchant nhận, chỉ có hai bước: Nháp và Hoàn tất. • Hoàn tất thì thực có kho nhận tăng, sổ biến động ghi một dòng. | 🚧 | URD-TRF-006 |
FR-007 | Đang giữ ở kho gửi là phần đã duyệt mà chưa xuất. Hệ thống tự tính, không ai nhập tay. • Duyệt 100: kho gửi giữ 100. Thực có chưa đổi, khả dụng giảm 100 ngay. • Xuất 60: thực có giảm 60, đang giữ còn 40. Khả dụng không đổi thêm, vì đã giảm từ lúc duyệt. • Xuất nốt 40: đang giữ về 0. | 🚧 | URD-TRF-007 · URD-RSV-009 |
FR-008 | Nhìn vào đang giữ là biết ai đang giữ. • Mở chi tiết một mặt hàng, bung ra thấy "phiếu chuyển số X giữ N", nằm cạnh các đơn bán cũng đang giữ. • Hàng bị kẹt thì biết ngay gỡ ở phiếu nào. | 🚧 | URD-RSV-004 · URD-RSV-005 |
FR-009 | Đang về ở kho nhận là tổng đã xuất trừ tổng đã nhận. Thấy được, nhưng chưa bán được. • Cột đang về đứng riêng, cạnh thực có, đang giữ và khả dụng. • Đang về không cộng vào khả dụng. Hàng chưa tới kho nhận thì chưa bán được. • Xuất 60, nhận 60 thì đang về về 0. Xuất tiếp 40 thì đang về là 40. | 🚧 | URD-TRF-008 |
FR-010 | Khai chuyển nhiều hơn số hàng kho gửi đang còn thì không duyệt được. • Duyệt là lúc hệ thống đối chiếu với khả dụng của kho gửi. Khai vượt thì bị chặn, kèm thông báo nêu rõ thiếu mặt hàng nào và còn lại bao nhiêu. • Mặt hàng đã bật cho bán âm thì vẫn duyệt được, đúng theo ý nghĩa của cờ này. | 🚧 | URD-RSV-002 · URD-RSV-003 |
FR-011 | Xuất vượt số kế hoạch vẫn được. Phiếu xuất ghi đúng số hàng thật sự rời kho, hệ thống không chặn chỉ vì nó lớn hơn số đã khai. | 🚧 | URD-TRF-009 |
FR-012 | Nhận vượt số đã xuất vẫn được. Phiếu nhập ghi đúng số đếm được tại kho nhận, hệ thống không chặn chỉ vì nó lớn hơn tổng đã xuất. | 🚧 | URD-TRF-010 |
FR-013 | Không nhận đủ thì người lập bấm Đóng phiếu. Đóng phiếu sinh một phiếu điều chỉnh ghi thất thoát. • Nút Đóng phiếu chỉ hiện khi tổng đã xuất lớn hơn tổng đã nhận. • Hệ thống hỏi lại số thất thoát và bắt chọn lý do rồi mới cho đóng. • Đóng xong: đang về của kho nhận về 0, phiếu điều chỉnh nằm trên sổ kho gửi kèm lý do và mã phiếu chuyển, phiếu chuyển hiện Đã nhận. | 🚧 | URD-TRF-011 · URD-TKT-013 |
FR-014 | Hủy phiếu được phép, nhưng hủy chỉ dừng phần chưa bao giờ xuất. • Phần đang giữ ở kho gửi được nhả hết, khả dụng tăng trở lại. Không có hàng nào mất, nên không sinh phiếu điều chỉnh. • Còn hàng đang về mà hủy thì hệ thống báo rõ số đó sẽ ghi thất thoát, và bắt xác nhận trước. • Bảng luật đủ mọi ca hủy và đóng nằm ở §7. | 🚧 | URD-TRF-012 · URD-TKT-014 |
FR-015 | Mọi hiệu chỉnh đều là lập phiếu mới. Phiếu cũ không bao giờ bị sửa. • Phiếu xuất và phiếu nhập đã hoàn tất không có nút Sửa, không có nút Xóa - kể cả sau khi phiếu chuyển bị đóng hay bị hủy. • Ghi nhầm thì xuất bù, nhận bù, hoặc lập phiếu điều chỉnh. Phiếu cũ để nguyên như đã ghi. | 🚧 | URD-TRF-013 · URD-TKT-008 |
FR-016 | Hàng trên đường là rủi ro của kho gửi. Và đang về không lẫn với hàng đặt nhà cung cấp. • Hàng mất hoặc hư trên đường là mất mát của kho gửi, cho tới khi kho nhận xác nhận. • Đang về chỉ đếm hàng đang chuyển giữa hai kho trong hệ thống. Hàng đã đặt nhà cung cấp mà chưa về thì không cộng vào đây. | 🚧 | URD-TRF-014 · URD-TRF-015 |
FR-017 | Chuyển kho không làm đổi giá vốn. Chỉ số lượng dịch chuyển giữa hai kho; giá vốn vẫn là một con số chung của chi nhánh (Merchant). | 🚧 | URD-TRF-016 |
FR-018 | Mỗi người chỉ thấy đúng việc của mình. • Người lập thấy một dòng: "Chuyển 20 lon, Merchant A - Kho mặc định sang Merchant B - Kho mặc định, đang chuyển". Phiếu xuất và phiếu nhập là chi tiết bên trong. • Thủ kho bên nhận thấy một việc: "nhận 20 lon từ Merchant A". Không thấy chứng từ của bên gửi. | 🚧 | URD-TRF-017 |
FR-019 | Màn danh sách phiếu chuyển: tra theo dòng, lọc, mở chi tiết. • Mỗi dòng: mã phiếu, merchant và kho hai bên, số dòng hàng, trạng thái, ngày lập. • Lọc theo trạng thái, theo merchant và kho từng bên, theo khoảng ngày. • Mở phiếu ra, mỗi dòng hàng hiện đủ năm con số: kế hoạch, đã xuất, đã nhận, đang giữ, đang về. | 🚧 | URD-TRF-018 |
FR-020 | Ba nhóm người đều duyệt và đóng được một phiếu chạm hai merchant. • Người của merchant gửi. • Người của merchant nhận. • Cấp quản lý trở lên của merchant trụ sở chính. • Ai bấm nút gì đều ghi lại trên phiếu. Để mở không có nghĩa là không truy được. | 🚧 | URD-TRF-019 |
5.1 Tiêu chí nghiệm thu
- Lập phiếu chuyển 100 lon từ
Merchant A - Kho mặc địnhsangMerchant B - Kho mặc định, một dòng hàng → phiếu lưu thành công và hiện mã phiếu. - Để trống merchant đích hoặc kho đích rồi bấm lưu → form báo lỗi, không lưu được phiếu.
- Chọn cùng một cặp merchant - kho cho cả hai đầu → form báo lỗi, không lưu được phiếu.
- Lập phiếu chuyển giữa hai merchant khác nhau, rồi lập một phiếu chuyển giữa hai kho của cùng một merchant → cả hai đi qua đúng cùng một luồng màn hình, không có ô nào hỏi "kiểu chuyển".
- Duyệt phiếu chuyển → phiếu hiện chữ "Chờ chuyển"; xuất chuyến đầu → phiếu hiện "Đang chuyển"; nhận đủ hàng → phiếu hiện "Đã nhận".
- Mở màn chi tiết phiếu chuyển → không có ô nào cho phép tự chọn trạng thái phiếu chuyển.
- Kho nguồn đang có 300 thực có và 300 khả dụng; duyệt phiếu chuyển 100 → thực có vẫn 300, đang giữ 100, khả dụng còn 200.
- Mở màn xem chi tiết đang giữ của mặt hàng đó tại kho nguồn → thấy dòng "phiếu chuyển số X giữ 100 đơn vị".
- Xuất chuyến đầu 60 lon → kho nguồn thực có còn 240, đang giữ còn 40, khả dụng vẫn 200; kho đích thấy đang về 60.
- Mở màn tồn kho của kho đích → cột đang về hiện 60, cột khả dụng không đổi; thử bán quá số hàng kho đích đang thật sự có → bị chặn.
- Thủ kho merchant đích nhận đủ 60 lon → kho đích thực có tăng 60, đang về về 0; kho nguồn không đổi.
- Xuất nốt chuyến hai 40 lon → kho nguồn thực có còn 200, đang giữ 0; kho đích đang về 40.
- Bên nhận chỉ đếm được 38 lon và ghi 38 → kho đích thực có tăng 38, đang về còn 2.
- Mặt hàng còn 10 khả dụng tại kho nguồn, lập phiếu chuyển 15 rồi bấm duyệt → hệ thống chặn và báo rõ mặt hàng nào thiếu, còn lại đúng 10.
- Bật cho bán âm cho mặt hàng đó rồi duyệt lại phiếu chuyển 15 → phiếu duyệt được bình thường.
- Phiếu chuyển kế hoạch 100, thủ kho xuất 110 lon → hệ thống cho ghi, phiếu xuất hoàn tất với 110, không có thông báo chặn nào.
- Tổng đã xuất là 110, bên nhận đếm được 115 và ghi 115 → hệ thống cho ghi, phiếu nhập hoàn tất với 115.
- Phiếu chuyển đã xuất 100 và mới nhận 98, bấm Đóng phiếu → hệ thống hỏi lại số thất thoát 2 và bắt chọn lý do; xác nhận xong, một phiếu điều chỉnh 2 lon được sinh ra kèm lý do và mã phiếu chuyển, số đang về của kho đích về 0, và phiếu chuyển hiện "Đã nhận".
- Mở sổ biến động của kho nguồn sau tình huống trên → thấy dòng điều chỉnh 2 lon thất thoát trỏ về đúng mã phiếu chuyển.
- Phiếu chuyển vừa được duyệt, chưa xuất chuyến nào, bấm Hủy → phần 100 lon đang giữ tại kho nguồn được nhả hết, khả dụng trở lại 300, thực có hai kho không đổi, và không có phiếu điều chỉnh nào được sinh ra.
- Phiếu chuyển đã xuất 60 và bên nhận mới nhận 38, bấm Hủy → hệ thống báo rõ 22 lon đang trên đường sẽ được ghi thất thoát và bắt xác nhận; xác nhận xong, phần 40 lon chưa xuất được nhả, và một phiếu điều chỉnh 22 lon được sinh ra.
- Phiếu chuyển đã xuất 60 và bên nhận đã nhận đủ 60, bấm Hủy → phần 40 lon chưa xuất được nhả, và không có phiếu điều chỉnh nào được sinh ra vì không có hàng nào mất.
- Mở một phiếu xuất đã hoàn tất → mọi ô nhập bị khóa, không có nút Sửa và không có nút Xóa.
- Ghi nhầm số trên một phiếu nhập đã hoàn tất → cách duy nhất để đưa số về đúng là lập một phiếu điều chỉnh mới; phiếu nhập cũ giữ nguyên.
- Hàng mất hết trên đường, bên nhận không nhận được gì → thực có kho đích không đổi, kho nguồn không tự cộng lại; người lập đóng phiếu và toàn bộ số đã xuất thành thất thoát trên một phiếu điều chỉnh.
- Lập một đơn mua hàng 30 lon cho nhà cung cấp, chưa nhận hàng → cột đang về của kho nhận vẫn là 0.
- Xem giá vốn của mặt hàng trước và sau khi chuyển kho hoàn tất → giá vốn không đổi.
- Người lập phiếu mở danh sách phiếu chuyển → thấy đúng một dòng: "Chuyển 20 lon, Merchant A - Kho mặc định sang Merchant B - Kho mặc định, đang chuyển".
- Thủ kho của merchant đích mở danh sách việc của mình → thấy đúng một việc "nhận 20 lon từ Merchant A", và không thấy phiếu xuất của merchant nguồn.
- Vào danh sách phiếu chuyển, lọc trạng thái "Đang chuyển" và chọn merchant nguồn là Merchant A → chỉ các phiếu khớp cả hai điều kiện hiện ra.
- Mở một phiếu chuyển đang chạy dở → mỗi dòng hàng hiện đủ số kế hoạch, tổng đã xuất, tổng đã nhận, phần đang giữ và phần đang về.
- Thủ kho của merchant nhận mở phiếu chuyển do merchant gửi lập → bấm duyệt được, và tên người duyệt hiện trên phiếu.
- Quản lý của merchant trụ sở chính mở cùng phiếu đó → bấm đóng phiếu được, kể cả khi mình không thuộc merchant gửi lẫn merchant nhận.
6. Yêu cầu phi chức năng
| Khía cạnh | Yêu cầu |
|---|---|
| Toàn vẹn tồn kho | Hoàn tất một phiếu xuất hoặc một phiếu nhập là một lần ghi trọn vẹn: tồn và sổ biến động cùng được ghi, hoặc không gì được ghi |
| Bốn con số suy ra được | Phần đang giữ ở kho nguồn và phần đang về ở kho đích luôn tính lại được từ tập phiếu con, nên không bao giờ lệch với chứng từ |
| Chống ghi trùng | Hoàn tất một phiếu con hai lần chỉ ghi sổ một lần; số lượng không bị cộng trừ nhân đôi |
| Chỉ ghi thêm | Không có đường nào trong nghiệp vụ sửa hoặc xóa một phiếu xuất hay phiếu nhập đã hoàn tất |
| Song song với bán hàng | Bán hàng tại kho nguồn diễn ra song song với một phiếu chuyển đang chạy mà không làm sai bốn con số; ràng buộc khả dụng bằng thực có trừ đang giữ luôn đúng ở mọi thời điểm |
| Phân quyền xuyên merchant | Phiếu xuất chỉ đọc và ghi được bởi merchant nguồn; phiếu nhập chỉ đọc và ghi được bởi merchant đích; phiếu cha đọc được ở cả hai đầu nhưng mỗi bên chỉ thấy phần của mình |
| Truy vết | Mọi biến động do phiếu chuyển sinh ra đều ghi vào sổ biến động kèm mã phiếu và lý do, tra ngược được từ một dòng sổ về đúng phiếu chuyển |
| i18n | Nhãn trạng thái theo nghiệp vụ chuyển kho và danh sách lý do hiển thị song ngữ |
7. UX & Luồng
Đường đi của một phiếu chuyển, từ lúc lập tới lúc chốt:
Hai đầu, hai người, hai bộ chứng từ:
7.1 Bảng luật hủy phiếu và đóng phiếu
Phiếu chuyển kế hoạch 100 lon. "Đang giữ" là phần đã duyệt nhưng chưa xuất. "Đang về" là tổng đã xuất trừ tổng đã nhận. Hủy phiếu dừng phần chưa bao giờ xuất; đóng phiếu chốt phần đã xuất mà không tới nơi. Trong mọi ca dưới đây, phiếu xuất và phiếu nhập đã hoàn tất đều giữ nguyên, không bị sửa và không bị xóa.
| Ca | Đang giữ ở kho nguồn | Thực có kho nguồn | Đang về ở kho đích | Thực có kho đích | Sinh phiếu điều chỉnh thất thoát |
|---|---|---|---|---|---|
| Hủy khi phiếu còn Nháp | Chưa giữ gì, không đổi | Không đổi | 0 | Không đổi | Không |
| Hủy khi phiếu Đã gửi, chưa ai duyệt | Chưa giữ gì, không đổi | Không đổi | 0 | Không đổi | Không |
| Hủy khi phiếu Đã duyệt (Chờ chuyển), chưa xuất chuyến nào | Nhả hết 100, về 0 | Không đổi | 0 | Không đổi | Không - không có hàng nào rời kho |
| Hủy khi đã xuất 60 và kho đích đã nhận đủ 60 | Nhả 40 còn lại, về 0 | Đã giảm 60 lúc xuất, không giảm thêm | 0 | Đã tăng 60 lúc nhận, không đổi thêm | Không - hàng đã xuất đều đã tới nơi |
| Hủy khi đã xuất 60 và kho đích mới nhận 38 | Nhả 40 còn lại, về 0 | Đã giảm 60, không giảm thêm | 22 được chốt, về 0 | Đã tăng 38, không đổi thêm | Có - phiếu điều chỉnh 22 lon thất thoát |
| Hủy khi đã xuất đủ 100 và kho đích mới nhận 90 | Đã về 0 từ lúc xuất hết | Đã giảm 100 | 10 được chốt, về 0 | Đã tăng 90 | Có - phiếu điều chỉnh 10 lon thất thoát |
| Hủy khi đã xuất 60 và kho đích chưa nhận gì | Nhả 40 còn lại, về 0 | Đã giảm 60, không giảm thêm | 60 được chốt, về 0 | Không đổi | Có - phiếu điều chỉnh 60 lon thất thoát |
| Đóng phiếu khi đã xuất 100 và chỉ nhận được 98, không chờ nữa | 0 | Đã giảm 100 | 2 được chốt, về 0 | Đã tăng 98 | Có - phiếu điều chỉnh 2 lon thất thoát |
| Phiếu đã Hoàn tất (Đã nhận đủ 100) | 0 | Đã giảm 100 | 0 | Đã tăng 100 | Không - và không còn nút hủy; sửa sai thì lập phiếu mới |
Toàn bộ thao tác lập phiếu, xuất hàng và nhận hàng nằm trong khu vực Kho của trang Client. Người lập thấy một dòng cho một việc chuyển; thủ kho merchant đích thấy đúng một việc "nhận hàng" trong danh sách của mình. Số đang về hiện thành một cột riêng trên màn tồn kho, cạnh thực có, đang giữ và khả dụng.
8. Dữ liệu & Miền nghiệp vụ
| Khái niệm | Vai trò |
|---|---|
| Phiếu chuyển (cha) | Chứng từ mang ý định: chốt merchant và kho ở cả hai đầu, danh sách hàng và số lượng kế hoạch |
| Phiếu xuất (con) | Chứng từ một chuyến hàng rời kho nguồn, thuộc merchant nguồn |
| Phiếu nhập (con) | Chứng từ một lần hàng vào kho đích, thuộc merchant đích |
| Dòng hàng của phiếu | Một mặt hàng: số kế hoạch, tổng đã xuất, tổng đã nhận, phần đang giữ, phần đang về |
| Đang giữ ở kho nguồn | Phần đã duyệt nhưng chưa xuất; ghi rõ phiếu chuyển nào đang giữ bao nhiêu |
| Đang về ở kho đích | Tổng đã xuất trừ tổng đã nhận; thấy được nhưng không khả dụng |
| Đóng phiếu | Thao tác của người lập, chốt phần đã xuất mà không tới nơi và sinh một phiếu điều chỉnh ghi thất thoát |
| Hủy phiếu | Thao tác dừng phần kế hoạch chưa xuất, nhả phần đang giữ, không sinh phiếu điều chỉnh |
| Phiếu điều chỉnh thất thoát | Phiếu kho sinh ra khi đóng phiếu, mang số hàng mất, lý do và mã phiếu chuyển |
Chỉ ở mức khái niệm - schema và bất biến đầy đủ nằm trong inventory domain model.
9. Phụ thuộc & Giả định
Phụ thuộc vào
| # | Feature | Phụ thuộc điều gì |
|---|---|---|
| 01 | TKT Phiếu kho | vòng đời chung, quan hệ phiếu cha - phiếu con, luật chỉ-ghi-thêm và luật đóng phiếu. |
| 02 | LOC Địa điểm kho | hai đầu của phiếu là hai địa điểm đang hoạt động, mỗi địa điểm thuộc một merchant. |
| 03 | STK Mục kho & mức tồn | bốn con số thực có, đang giữ, khả dụng, đang về là nền của toàn bộ luồng chuyển kho. |
| 04 | RSV Giữ tồn | phần đang giữ của phiếu chuyển dùng chung cơ chế ghi tên người giữ với đơn bán hàng. |
| 05 | LDG Sổ biến động | nơi ghi mọi biến động do các phiếu con sinh ra. |
| 06 | VAL Giá vốn | giá vốn theo merchant, nên chuyển kho không đụng tới tiền. |
Giả định
| # | Giả định | Sai thì sao |
|---|---|---|
| 01 | Hai merchant chuyển hàng cho nhau nằm trong cùng một organizer, nên tin nhau ở mức nghiệp vụ. | Chuyển ra ngoài organizer thì cần duyệt hai phía và kiểm soát chặt hơn hẳn; mô hình trong bản này không đủ. |
| 02 | Người nhận tại kho đích đếm hàng thật rồi mới ghi phiếu nhập, không ghi cho có. | Ghi bừa bằng số kế hoạch thì thất thoát bị giấu, và kiểm kê sau này gánh toàn bộ phần lệch mà không truy được nguồn. |
| 03 | Người lập phiếu là người biết rõ nhất khi nào nên chốt phần hàng không về nữa. | Không ai chốt thì phiếu treo mãi, số đang về ở kho đích phình lên và không ai dọn. |
| 04 | Hàng đã xuất mà không tới nơi là mất thật, không phải chỉ là chậm. | Đóng phiếu sớm khi hàng chỉ chậm thì ghi thất thoát oan; hàng về sau thành hàng thừa không rõ nguồn gốc. |
10. Kế hoạch phát hành & Tiêu chí
| Khía cạnh | Kế hoạch |
|---|---|
| Phase | P2 (Kho) - xem danh mục feature URD |
| Rollout | Mọi merchant có từ hai kho trở lên, và mọi organizer có từ hai merchant trở lên; không feature flag |
| Migration | Không có dữ liệu chuyển kho cũ phải chuyển đổi; phiếu chuyển đầu tiên bắt đầu từ tồn hiện tại |
| Tiêu chí phát hành | Chọn được cặp merchant - kho ở cả hai đầu; một phiếu cha chạy được nhiều phiếu xuất và nhiều phiếu nhập; bảng bốn con số khớp đúng kịch bản nghiệm thu ở cả hai đầu; bảng luật hủy và đóng ở §7.1 chạy đúng từng ca; phiếu con đã hoàn tất không sửa được |
| Theo dõi | Số phiếu chuyển theo trạng thái, số phiếu bị đóng và tổng số lượng thất thoát theo tháng, số phiếu treo với hàng đang về quá lâu, số lần xuất vượt và nhận vượt |
Tham chiếu
- URD: Chuyển kho
- Liên quan: Phiếu kho · Mục kho & mức tồn · Giữ tồn & chặn bán quá tay · Sổ biến động · Kiểm kê · Giá vốn
- Module: Kho - URD
- Developer: @nx/inventory · domain model
Rủi ro & Câu hỏi mở
| # | Rủi ro / câu hỏi | Giảm thiểu / trạng thái |
|---|---|---|
| 01 | Ai được duyệt và ai được đóng một phiếu chuyển chạm hai merchant | Đã chốt: người thuộc merchant gửi, người thuộc merchant nhận, và cấp quản lý trở lên của merchant trụ sở chính đều làm được. Để mở có chủ đích, không siết ở bản này. |
| 02 | Kho nhận ghi cho có mà không đếm, khiến phần thất thoát bị chôn vào tồn kho đích | Người nhận phải tự nhập số đếm cho từng lần nhận (FR-006); phần lệch luôn để lại dấu vết qua phiếu điều chỉnh khi đóng phiếu (FR-013) |
| 03 | Phiếu bị bỏ quên với hàng treo mãi ở "đang về" | Mở: cần cảnh báo cho phiếu còn hàng đang trên đường quá số ngày cấu hình được |
| 04 | Người dùng nhầm nút Hủy với nút Đóng và làm mất dấu phần thất thoát | Hủy khi còn hàng đang về thì hệ thống bắt xác nhận phần sẽ ghi thất thoát (FR-014); bảng luật đầy đủ ở §7.1 |
| 05 | Nhận vượt số đã xuất làm tồn kho đích phồng lên không lý do | Cho phép ghi đúng số đếm được (FR-012); phần vượt hiện rõ trên màn chi tiết phiếu và được đối chiếu bằng kiểm kê |
| 06 | Mặt hàng bật cho bán âm bị chuyển vượt tồn, kéo thực có kho nguồn xuống âm | Chấp nhận theo đúng ý nghĩa của cờ cho bán âm (FR-010); số âm hiện rõ trên màn tồn và được xử lý bằng kiểm kê |
Câu hỏi thường gặp
| # | Câu hỏi | Trả lời |
|---|---|---|
| 01 | Chuyển hàng giữa hai merchant có được không? | Được, và đó là nghiệp vụ bình thường. Lập phiếu chuyển thì chọn đủ bốn thứ: merchant nào - kho nào xuất, merchant nào - kho nào nhận. Chuyển giữa hai kho của cùng một chi nhánh chạy giống hệt, chỉ khác ở chỗ hai bên cùng thuộc một chi nhánh. |
| 02 | Vì sao kho đích không được cộng hàng vào tồn ngay lúc kho nguồn xuất? | Vì hàng lúc đó đang trên xe, chưa nằm trên kệ kho đích. Nếu cộng ngay, thu ngân kho đích sẽ bán được số hàng chưa tới nơi. Số đang về giải đúng chuyện này: nhìn thấy được để lên kế hoạch, nhưng không cộng vào khả dụng. |
| 03 | Tại sao lúc Chờ chuyển thực có của kho nguồn chưa giảm? | Vì hàng vẫn còn trên kệ kho nguồn, người kiểm kê đi đếm vẫn thấy nó. Cái giảm là khả dụng, vì phần hàng đó đã được hứa cho phiếu chuyển. Đúng như luật chung: người bán hàng nhìn khả dụng, người kiểm kê nhìn thực có. |
| 04 | Một phiếu chuyển có bắt buộc xuất một lần hết không? | Không. Xuất mấy chuyến cũng được, nhận mấy lần cũng được. Mỗi chuyến là một phiếu xuất của merchant nguồn, mỗi lần nhận là một phiếu nhập của merchant đích. Phần chưa xuất vẫn nằm ở đang giữ tại kho nguồn, và bạn luôn nhìn thấy còn phải xuất bao nhiêu. |
| 05 | Xuất nhiều hơn số ghi trên phiếu thì sao? | Được. Ghi đúng số hàng thật sự lên xe. Nhận nhiều hơn số đã xuất cũng được. Số trên phiếu là kế hoạch, còn hàng thì là hàng - sổ sách phải phản ánh chuyện đã xảy ra. |
| 06 | Nhận thiếu 2 lon thì 2 lon đó nằm ở đâu? | Ở phần đang về của kho đích, cho tới khi bạn quyết. Nếu hàng vẫn đang tới thì cứ chờ. Nếu biết chắc nó mất rồi thì bấm Đóng phiếu: hệ thống sinh một phiếu điều chỉnh ghi 2 lon thất thoát kèm lý do, và số đang về về 0. Kho nguồn chịu rủi ro trên đường đi, nên hàng thất lạc là mất mát của kho nguồn. |
| 07 | Đóng phiếu và hủy phiếu khác nhau chỗ nào? | Hủy là dừng phần chưa bao giờ xuất: hàng vẫn trên kệ kho nguồn, chỉ cần nhả phần đang giữ, không có gì mất. Đóng là chốt phần đã xuất mà không tới nơi: hàng đã rời kho và không quay lại, nên nó là thất thoát và luôn sinh một phiếu điều chỉnh. Nếu bạn hủy một phiếu mà vẫn còn hàng đang trên đường thì hệ thống sẽ báo rõ phần đó vẫn phải ghi thất thoát - hàng không được phép biến mất im lặng. |
| 08 | Ghi sai một phiếu xuất rồi thì sửa thế nào? | Không sửa. Phiếu con đã hoàn tất là chốt, không có nút sửa và không có nút xóa. Muốn đưa số về đúng thì lập thêm một phiếu: một chuyến xuất bù, một lần nhận bù, hoặc một phiếu điều chỉnh. Sửa sai là ghi thêm một tờ, không phải xé tờ cũ. |
| 09 | Chuyển kho có làm đổi giá vốn không? | Không. Giá vốn là một con số cho cả merchant, không tính theo từng kho. Chuyển hàng chỉ dịch chuyển số lượng, không đụng tới tiền. Giá vốn chỉ đổi khi nhập hàng mới với giá khác. |