Ministock trong Odoo 20 theo dõi số lượng, dự báo và giá trị tồn kho mà không cần ứng dụng Inventory như thế nào, vì sao tồn kho thay đổi theo hóa đơn, và khi nào doanh nghiệp cần Inventory đầy đủ.
Trong một thời gian dài, doanh nghiệp bán hàng hóa vật lý trên Odoo chỉ có hai lựa chọn:
- không theo dõi tồn kho trong Odoo; hoặc
- cài Inventory và áp dụng toàn bộ các khái niệm của một hệ thống quản lý kho: phiếu nhập, phiếu xuất, vị trí kho, stock move, điều chuyển, loại hoạt động và nhiều thứ khác.
Inventory đầy đủ là hợp lý khi doanh nghiệp cần kiểm soát hoạt động kho vật lý: vị trí, truy xuất nguồn gốc, giữ hàng, lấy hàng hay dịch chuyển trong sản xuất. Nhưng sẽ khó thuyết phục hơn với một công ty chỉ cần câu trả lời đơn giản: có 40 cái, mua thêm 20, bán 12, vậy giờ còn bao nhiêu?
Ministock lấp khoảng trống đó. Tính năng này cho biết số lượng, dự báo và giá trị tồn kho ở mức cơ bản mà không cần đến ứng dụng Inventory đầy đủ.
Chữ quan trọng ở đây là cơ bản. Ministock không phải một hệ thống quản lý kho thu nhỏ, mà là một mô hình tồn kho khác, dành cho doanh nghiệp không vận hành quy trình kho.
Ministock cũng hoạt động khác với điều mà phần lớn người dùng Odoo nghĩ. Tồn kho không thay đổi khi hàng được nhận hay giao, mà thay đổi khi hóa đơn nhà cung cấp hoặc hóa đơn khách hàng được ghi sổ. Chính lựa chọn thiết kế này, hơn là việc thiếu tính năng kho nào đó, quyết định ai nên dùng Ministock.
Bài viết dựa trên branch 20.0 của Odoo Community tại thời điểm rà soát ngày 21/9/2026. Giao diện vẫn có thể thay đổi trong các cập nhật sau của branch này.
Ministock nằm ở đâu?
Ministock thuộc Odoo Community, không phải tính năng riêng của Enterprise.
Không có addon mini_stock riêng. Hành vi của nó được phân bổ qua các module Community:
productlưu một số lượng tồn đơn giản;saletính số lượng dự kiến xuất;purchasetính số lượng dự kiến nhập;accountthay đổi số lượng tồn khi hóa đơn được ghi sổ và cung cấp cách định giá đơn giản; vàstock, nếu được cài sau này, sẽ thay mô hình đơn giản này bằng stock move, quant, vị trí kho và các hoạt động kho.
Addon Enterprise stock_enterprise phụ thuộc vào module stock của Community và bổ sung các view, báo cáo nâng cao. Nó không chứa phần implementation cốt lõi của Ministock.
Mô tả của Odoo khớp với mã nguồn: Ministock theo dõi mức tồn và giá trị tồn kho mà không có điều chuyển hay quy trình kho. Odoo giới thiệu tính năng này trong tài liệu phát hành 19.3, nghĩa là nó xuất hiện trong chu kỳ 19.x và nay là một phần của kiến trúc Odoo 20.
Ministock thể hiện tồn kho như thế nào?
Khi không cài Inventory, product.product có trường qty_available phụ thuộc theo công ty. Nói cách khác, Odoo lưu một số dư tồn cho mỗi biến thể sản phẩm trên mỗi công ty.
Người dùng có thể bật Track Inventory trên sản phẩm và cập nhật trực tiếp Quantity On Hand ngay trên form sản phẩm. Giao diện không dùng tên “Ministock”; thiết lập cần tìm là Track Inventory.
Model sản phẩm còn cung cấp:
- On Hand: số lượng đang sở hữu, được lưu trực tiếp;
- Incoming: số lượng mua đã xác nhận nhưng chưa có hóa đơn nhà cung cấp;
- Outgoing: số lượng bán đã xác nhận nhưng chưa xuất hóa đơn;
- Forecasted: On Hand cộng Incoming trừ Outgoing; và
- Free to Use: On Hand trừ Outgoing, không bao giờ hiển thị dưới 0.
Công thức trung tâm là:
Forecasted = On Hand + Incoming - Outgoing
Cách này cho người dùng nghiệp vụ cái nhìn về tồn kho ở góc độ thương mại, chứ không phải bản ghi các hoạt động kho vật lý.
Ảnh chụp màn hình trong bài được lấy từ một database Odoo 20 Community chạy local, có cài Sales và Purchase nhưng không cài addon stock. Ví dụ sử dụng các model chuẩn và giao diện gốc của Odoo.
Chi tiết quan trọng nhất: Ministock chạy theo hóa đơn
Rất dễ mô tả Ministock là “mua thì tăng tồn, bán thì giảm tồn”. Về hướng thì đúng, nhưng về kỹ thuật thì chưa đủ.
Trong code Odoo 20, số lượng tồn được lưu chỉ thay đổi khi chứng từ kế toán được ghi sổ:
| Chứng từ được ghi sổ | Ảnh hưởng tới Ministock |
|---|---|
| Hóa đơn khách hàng | Giảm tồn |
| Giấy báo có cho khách hàng | Tăng tồn |
| Hóa đơn nhà cung cấp | Tăng tồn |
| Hoàn tiền từ nhà cung cấp | Giảm tồn |
Điều này áp dụng cho mọi dòng hóa đơn đã ghi sổ của sản phẩm có theo dõi tồn, dù dòng đó có xuất phát từ đơn hàng hay không. Đưa hóa đơn đã ghi sổ về trạng thái nháp sẽ đảo ngược phần cập nhật số lượng.
Trên thực tế, chạy Deliver trên đơn bán hàng (từ menu Actions) hay bấm Receive trên đơn mua hàng không tự làm thay đổi số tồn.
Các thao tác này cập nhật số lượng đã giao hoặc đã nhận trên dòng đơn hàng. Chúng phục vụ việc theo dõi trạng thái giao nhận và chuẩn bị xuất hóa đơn, còn số tồn chỉ thay đổi khi hóa đơn khách hàng hoặc hóa đơn nhà cung cấp tương ứng được ghi sổ.
Vòng đời đơn giản hóa vì vậy gần với sơ đồ sau hơn:
Đơn bán hàng đã xác nhận
│
├── cộng vào số lượng dự kiến xuất
│
├── Deliver đánh dấu dòng đơn là đã giao
│
└── hóa đơn khách hàng được ghi sổ làm giảm On Hand
Đơn mua hàng đã xác nhận
│
├── cộng vào số lượng dự kiến nhập
│
├── Receive đánh dấu dòng đơn là đã nhận
│
└── hóa đơn nhà cung cấp được ghi sổ làm tăng On Hand
Có một điểm lệch nhỏ giữa mô tả của trường và cách tính. Phần help text nói tới hàng mua “chưa nhận” và hàng bán “chưa giao”, nhưng code Community lại tính dự báo từ số lượng chưa xuất hóa đơn:
Incoming = số lượng mua đã xác nhận - số lượng mua đã có hóa đơn
Outgoing = số lượng bán đã xác nhận - số lượng bán đã xuất hóa đơn
Vì vậy, một đơn mua đã nhận hàng nhưng chưa có hóa đơn vẫn có thể nằm trong Incoming, và một đơn bán đã giao nhưng chưa xuất hóa đơn vẫn có thể nằm trong Outgoing. Khi không có Inventory, không có phiếu kho hay stock move nào ghi nhận sự kiện vật lý, nên chính hóa đơn là thứ cập nhật sổ tồn đơn giản này. Người triển khai nên làm rõ thời điểm này ngay từ giai đoạn khảo sát.
Đây là giới hạn quan trọng nhất cần hiểu. Thiết kế này phù hợp khi việc xuất hóa đơn diễn ra sát với lúc giao nhận hàng. Nếu doanh nghiệp giao hàng ngày 1 nhưng ngày 30 mới xuất hóa đơn, On Hand vẫn tính số hàng đó là còn trong kho suốt gần một tháng. Sai lệch tương tự cũng xảy ra khi số lượng thực tế thường xuyên khác số lượng trên hóa đơn.
Một ví dụ cụ thể
Giả sử một công ty nhỏ đang có 12 máy pha cà phê. Công ty xác nhận một đơn mua 8 máy và một đơn bán 5 máy:
On Hand 12
Incoming 8
Outgoing 5
--
Forecasted 15
Free to Use 7
Trước khi có hóa đơn, form sản phẩm kết hợp số dư đã lưu với cung và cầu đã xác nhận: 12 On Hand, 8 Incoming, 5 Outgoing, 15 Forecasted và 7 Free to Use.
1. Đánh dấu đơn mua đã nhận hàng
Dòng đơn mua chuyển sang đã nhận, nhưng On Hand vẫn là 12. Ministock không tạo phiếu nhập kho hay stock move nào.
Đơn mua đã nhận đủ hàng nhưng chưa có hóa đơn. Sản phẩm vẫn ở mức 12 On Hand, và 8 máy vẫn nằm trong dự báo Incoming.
2. Ghi sổ hóa đơn nhà cung cấp
On Hand tăng từ 12 lên 20. Vì số lượng mua giờ đã có hóa đơn, nó không còn được tính là hàng dự kiến nhập.
On Hand 20
Incoming 0
Outgoing 5
Forecasted 15
3. Đánh dấu đơn bán đã giao hàng
Dòng đơn bán chuyển sang đã giao, nhưng On Hand vẫn là 20 cho tới khi hóa đơn được ghi sổ.
Đơn bán đã giao đủ nhưng chưa xuất hóa đơn. Riêng trạng thái giao hàng không làm thay đổi số lượng Ministock.
4. Ghi sổ hóa đơn khách hàng
On Hand giảm từ 20 xuống 15. Số lượng bán đã xuất hóa đơn không còn được tính là hàng dự kiến xuất.
On Hand 15
Incoming 0
Outgoing 0
Forecasted 15
Sau khi hóa đơn nhà cung cấp và hóa đơn khách hàng được ghi sổ, Odoo hiển thị 15 On Hand, Incoming và Outgoing đều về 0. Forecasted vẫn là 15.
Ministock và Inventory đầy đủ
Với Odoo Inventory đầy đủ, số lượng được tính từ các bản ghi kho vật lý:
Đơn mua hàng → Phiếu nhập → Stock Move → Vị trí / Quant → On Hand
Đơn bán hàng → Phiếu xuất → Stock Move → Vị trí / Quant → On Hand
Với Ministock, mô hình được cố ý làm phẳng hơn:
Số dư sản phẩm
+ hóa đơn nhà cung cấp đã ghi sổ
- hóa đơn khách hàng đã ghi sổ
± hoàn tiền và điều chỉnh thủ công
Ministock biết tổng số dư của một sản phẩm trên một công ty, nhưng không biết hàng đang ở đâu, đã dịch chuyển thế nào hay đơn hàng nào đã được giao bằng những đơn vị hàng cụ thể nào.
| Yêu cầu | Ministock | Inventory đầy đủ |
|---|---|---|
| Tổng số lượng tồn | Có | Có |
| Dự báo nhập và xuất | Có | Có |
| Sửa trực tiếp số lượng sản phẩm | Có | Có, qua điều chỉnh tồn kho |
| Đánh dấu đã giao/đã nhận thủ công | Có | Được thay bằng các hoạt động kho |
| Giá trị tồn kho ước tính | Có | Có |
| Kho, vị trí kho và điều chuyển | Không | Có |
| Phiếu nhập, phiếu xuất và giữ hàng | Không | Có |
| Lô, số serial và hạn sử dụng | Không | Có |
| Thao tác bằng mã vạch | Không | Có, với ứng dụng Barcode |
| Quy tắc bổ sung hàng | Không | Có |
| Truy xuất nguồn gốc vật lý chi tiết | Không | Có |
| Định giá theo từng lần dịch chuyển | Không | Có, với Stock Accounting |
Ministock phục vụ giai đoạn trước khi doanh nghiệp cần đến hoạt động kho.
Những trường hợp phù hợp
Ứng viên phù hợp nhất là doanh nghiệp mà tồn kho có ý nghĩa nhưng hậu cần vật lý vẫn đơn giản, bất kể quy mô công ty.
Công ty tư vấn hoặc lắp đặt có bán thiết bị
Công ty chủ yếu bán dịch vụ nhưng giữ một ít laptop, router, thiết bị thay thế hoặc phụ kiện tại một văn phòng. Cùng một người xác nhận đơn, giao hàng và xuất hóa đơn. Tổng số hàng sẵn có là điều quan trọng; kiểm soát tới từng ngăn kệ thì không.
Nhà phân phối chuyên biệt quy mô nhỏ
Một doanh nghiệp ba người bán thiết bị đo lường từ một kho nhỏ. Họ cần biết hàng nào đang có, hàng nào đã đặt nhà cung cấp và hàng nào đã cam kết với khách. Họ không có đội kho hay quy trình giao hàng nhiều bước.
Phòng khám có bán lẻ hoặc vật tư đơn giản
Một phòng khám thú y có thể dùng Ministock cho thức ăn thú cưng, vòng cổ, dầu tắm, văn phòng phẩm hoặc các vật tư tiêu hao đơn giản khác khi chỉ cần biết tổng số dư.
Phòng khám không nên dùng Ministock cho thuốc, vắc-xin hay sản phẩm được quản lý đặc biệt khi cần truy xuất theo lô, hạn dùng, điều kiện bảo quản, thu hồi hoặc kiểm soát theo quy định.
Doanh nghiệp mới khởi đầu với một điểm tồn kho
Ministock có thể là điểm khởi đầu phù hợp khi một người vừa lo mua hàng, bán hàng, xuất hóa đơn vừa quản lý kệ hàng. Doanh nghiệp có thể chuyển sang Inventory đầy đủ khi bắt đầu có nhiều vị trí kho, vai trò kho riêng, quét mã vạch, truy xuất nguồn gốc hoặc các bước giao hàng tách biệt.
Khi nào Ministock không phù hợp?
Hãy dùng Inventory đầy đủ ngay khi doanh nghiệp cần biết sản phẩm đang ở đâu, khách hàng đã nhận lô hay số serial nào, khi nào hàng hết hạn, hàng đã qua kiểm tra chất lượng chưa, số lượng nào đang được giữ cho đơn hàng nào hoặc ai sẽ lấy và đóng gói hàng. Điều này cũng áp dụng khi tuyến vận chuyển, quy tắc bổ sung hàng hoặc lịch sử vật lý và định giá đầy đủ là quan trọng.
Định giá tồn kho đơn giản
Ministock cũng hỗ trợ cách nhìn đơn giản về giá trị tồn kho.
Khi danh mục sản phẩm dùng Average Cost (AVCO), việc ghi sổ hóa đơn nhà cung cấp sẽ cập nhật giá vốn sản phẩm theo phương pháp bình quân di động. Phương pháp mặc định là Standard Price, không làm thay đổi giá vốn. Khi không có Inventory và Stock Accounting đầy đủ, Odoo ước tính giá trị tồn kho hiện tại như sau:
Giá trị tồn kho = Quantity On Hand × Giá vốn hiện tại của sản phẩm
Với một ngày báo cáo trong quá khứ, Odoo dựng lại số lượng tại thời điểm đó bằng cách đảo ngược các hóa đơn đã ghi sổ có ngày hạch toán sau ngày đó. Tuy nhiên, Odoo vẫn áp dụng giá vốn hiện tại, nên không nên nhầm cách này với định giá lịch sử theo từng lần dịch chuyển.
Vì vậy, Ministock có thể trả lời câu hỏi “tồn kho của mình đáng giá khoảng bao nhiêu?”. Nó không cung cấp được bằng chứng định giá theo từng lần dịch chuyển mà Inventory đầy đủ gắn với từng phiếu nhập, phiếu xuất, lô hàng hay chi phí mua hàng, và không nên được xem là giải pháp thay thế cho định giá theo dịch chuyển khi cần kiểm toán được từng lần dịch chuyển vật lý.
Điều gì xảy ra khi cài Inventory sau này?
Odoo có sẵn cơ chế chuyển từ Ministock sang Inventory đầy đủ.
Khi cài stock, post-installation hook của module sẽ đọc các số lượng Ministock đã lưu và, với mỗi công ty, tạo điều chỉnh tồn kho tại vị trí kho của kho đầu tiên thuộc công ty đó. Từ đó trở đi, qty_available được tính từ quant và stock move thay vì được lưu như một số dư sản phẩm đơn giản.
Chiều ngược lại cũng có. Nếu gỡ stock, Odoo lưu số lượng tồn đang tính được trở lại vào trường ở cấp sản phẩm.
Trước khi cài stock, cần lưu ý:
- Các đơn bán, đơn mua, hóa đơn khách hàng và hóa đơn nhà cung cấp hiện có vẫn được giữ trong Odoo.
- Ministock không thể cung cấp lịch sử vị trí, điều chuyển, giữ hàng hay dịch chuyển lô chưa từng được ghi nhận.
- Lịch sử dịch chuyển kho đầy đủ chỉ bắt đầu khi quy trình Inventory đầy đủ bắt đầu.
- Vị trí kho, tuyến, quy tắc truy xuất, vai trò và kiểm soát chuyển đổi vẫn cần được thiết kế khi triển khai.
Một câu hỏi khảo sát tốt hơn
Khi khảo sát, “Anh chị có cần Inventory không?” là câu hỏi quá chung chung. Câu hỏi hữu ích hơn là: Odoo cần biết và kiểm soát những gì về hàng hóa vật lý của doanh nghiệp?
Nếu câu trả lời chủ yếu là:
Mình đang có bao nhiêu?
Bao nhiêu đang chờ nhà cung cấp giao?
Bao nhiêu đã hứa giao cho khách?
Có đủ hàng không?
Tồn kho đáng giá khoảng bao nhiêu?
thì Ministock đáng được cân nhắc.
Nếu câu trả lời có cả:
Hàng đang ở đâu?
Đây là đơn vị hay lô nào?
Ai sẽ di chuyển hàng?
Đơn nào đang giữ hàng này?
Hàng nên đi theo tuyến nào?
Khi nào hết hạn?
Toàn bộ lịch sử vật lý và định giá của hàng là gì?
thì doanh nghiệp cần Inventory đầy đủ.
Cách phân biệt này hữu ích hơn so với chỉ dựa vào quy mô công ty, doanh thu hay số lượng SKU.
Bài học khi triển khai
Ministock cho phép việc triển khai khớp với cách doanh nghiệp thực sự vận hành. Các bước kho giúp kiểm soát tốt hơn khi có quy trình kho; còn khi một người bán, giao và xuất hóa đơn trong một luồng ngắn, những bước đó có thể không mang lại nhiều giá trị. Độ phức tạp nên xuất phát từ yêu cầu nghiệp vụ.
Ministock là một tầng trung gian hữu ích:
Không theo dõi tồn kho
↓
Ministock: nắm số lượng ở góc độ thương mại và kế toán
↓
Inventory đầy đủ: vận hành kho vật lý và truy xuất nguồn gốc
Với doanh nghiệp có hậu cần đơn giản, tầng trung gian này có thể giảm công cấu hình và đào tạo. Doanh nghiệp cần vị trí kho, lô, hạn dùng, giữ hàng, sản xuất hoặc tách bạch rõ giữa dịch chuyển hàng và xuất hóa đơn thì cần Inventory đầy đủ.
Kết luận không phải là Inventory có hay không cũng được. Inventory đầy đủ chỉ là tùy chọn khi hoạt động kho là tùy chọn.
Tham chiếu kỹ thuật
Các kết luận trên dựa trên những điểm implementation sau trong Odoo 20 Community:
addons/product/models/product_product.py: trườngqty_availableđược lưu, các trường dự báo, dự báo cơ sở và giá vốn bình quân di động đơn giản;addons/product/models/product_template.py: Track Inventory và các trường số lượng trên product template;addons/product/views/product_views.xml: sửa trực tiếp số lượng tồn khi không cóstock;addons/sale/models/product_product.py: số lượng dự kiến xuất và dự báo từ các dòng đơn bán đã xác nhận, chưa xuất hóa đơn;addons/sale/models/sale_order.py:deliver_sold_quantity(), được chạy bởi server action Deliver;addons/purchase/models/product.py: số lượng dự kiến nhập và dự báo từ các dòng đơn mua đã xác nhận, chưa có hóa đơn;addons/purchase/models/purchase_order.py: thao tác Receive thủ công;addons/account/models/account_move.py: cập nhật số tồn và giá vốn bình quân khi hóa đơn được ghi sổ;addons/account/models/company.py: cách tính giá trị tồn kho đơn giản khi không cóstock;addons/stock/models/product.py: thay số lượng đơn giản bằng cách tính dựa trên quant và stock move;addons/stock/data/stock_data.xmlvàaddons/stock/models/res_company.py: kho được tạo khi càistock; vàaddons/stock/__init__.py: chuyển đổi giữa số lượng Ministock đã lưu và số lượng Inventory đầy đủ khi cài hoặc gỡ module.
Thông tin chính thức về sản phẩm: