OpsOne AI · Quản lý kho
Hướng dẫn sử dụng · v1.0

Quản lý kho đa kho, đa vị trí, lot & serial

Module Quản lý kho OpsOne AI giúp anh/chị vận hành đầy đủ chuỗi nghiệp vụ kho hiện đại: nhiều kho, nhiều vị trí (bin), lot/batch, serial/IMEI, mã vạch, pick list, putaway, kiểm kê, trả hàng và phân tích kho thông minh bằng AI.

Mọi giao dịch (nhập, xuất, chuyển, kiểm kê, trả hàng) đều ghi vào bảng stock_transactions bất biến — phục vụ truy vết và đối soát kế toán. Tồn kho luôn tách thành 5 lớp: Tồn vật lý (on hand), Có thể bán (available), Giữ hàng (committed cho đơn đã chốt), Đang lấy (picking), Đang giao (shipping) — giúp anh/chị tránh oversell.

Phù hợp cho: doanh nghiệp bán lẻ, phân phối, thương mại điện tử, sản xuất, thực phẩm, dược, điện tử — từ 1 kho đơn giản đến chuỗi 10+ kho có lot tracking và serial bảo hành.

Năng lực chính

  1. Multi-warehouse — đăng ký nhiều kho (kho chính, kho chi nhánh, kho ký gửi), chuyển hàng nội bộ.
  2. Multi-location (bin) — chia kho thành vị trí kệ/ô, gán SKU vào vị trí, scan mã vị trí khi nhập/xuất.
  3. Lot/Batch tracking — quản lý theo số lô, hạn sử dụng, FEFO (First Expired First Out).
  4. Serial/IMEI — track từng đơn vị có số seri (xe máy, điện tử, máy móc bảo hành).
  5. Barcode — sinh mã vạch SKU, in label, quét bằng app di động.
  6. AI Phân tích & Dự báo — gợi ý nhập hàng dựa trên lịch sử bán + tồn kho hiện tại.

2. Thuật ngữ cốt lõi

Hiểu đúng các khái niệm dưới đây sẽ giúp anh/chị đọc báo cáo, cấu hình quy trình và đào tạo nhân viên kho nhanh hơn.

Warehouse Kho
Một địa điểm vật lý lưu trữ hàng hoá (kho chính, kho chi nhánh, kho ký gửi, kho đại lý). Mỗi kho có địa chỉ, người quản lý, trạng thái hoạt động.
Ví dụ: "Kho HCM Q7", "Kho Hà Nội Long Biên", "Kho ký gửi Đà Nẵng".
Location / Bin Vị trí
Vị trí cụ thể bên trong một kho — kệ, ô, ngăn. Có mã riêng (thường in dán dạng barcode) để nhân viên scan khi nhập/xuất.
Ví dụ: "A1-03-02" (dãy A1, kệ 03, ngăn 02), "PALLET-12".
Inventory Item SKU instance
Một dòng tồn kho — đại diện cho một SKU trong một kho cụ thể. Cùng một SKU nằm ở 3 kho sẽ tạo 3 inventory item khác nhau. Mỗi item có: on_hand (tồn vật lý), available_qty (có thể bán), committed_qty (giữ hàng), min_qty (mức tối thiểu cảnh báo), cost_price, selling_price.
Stock Transaction Giao dịch kho
Mọi thay đổi tồn kho đều ghi thành 1 dòng transaction bất biến (immutable). Bao gồm: nhập hàng từ nhà cung cấp, xuất hàng theo đơn, chuyển kho, kiểm kê điều chỉnh, trả hàng. Trường source ghi rõ nguồn (sapo, manual, transfer, return, stocktake).
Ví dụ: "Đóng gói & xuất kho đơn hàng #SP1234 — qty_out 2", "Nhận hàng vào kho PO-2026-0410 — qty_in 50".
Pick List Phiếu lấy hàng
Danh sách hàng cần lấy ra để đóng gói cho đơn đã xác nhận. Có code (vd PK-2026-0001), trạng thái pending → picking → picked → packed → shipped, và danh sách item kèm số lượng + vị trí gợi ý.
Putaway Xếp kho
Quá trình đưa hàng mới nhập về đúng vị trí trong kho. Hệ thống có thể gợi ý vị trí dựa trên rule cấu hình (theo SKU, danh mục, nhà cung cấp).
Stocktake Kiểm kê
Đợt đếm tồn kho định kỳ (tháng, quý, năm) để đối chiếu sổ sách với thực tế. Hệ thống sinh phiếu kiểm kê, nhân viên đếm + nhập số liệu, sai lệch sẽ sinh adjustment transaction.
Lot / Batch Lô hàng
Nhóm hàng cùng số lô, ngày sản xuất, hạn sử dụng. Cho phép truy vết và xuất theo nguyên tắc FEFO.
Ví dụ: Sữa lô "LOT-2026-05-A" HSD 30/11/2026 — 200 hộp.
Serial / IMEI Số seri
Mã định danh duy nhất gắn vào từng đơn vị hàng (1 chiếc xe máy = 1 serial). Trạng thái: in_stock (đang trong kho), sold (đã bán), warranty (đang bảo hành), disposed (huỷ/loại bỏ).
FEFO First Expired First Out
Nguyên tắc xuất hàng: lô nào sắp hết hạn trước thì xuất trước. Áp dụng cho thực phẩm, dược phẩm, hoá chất.
FIFO First In First Out
Nguyên tắc xuất hàng: lô nào nhập kho trước thì xuất trước. Áp dụng cho hàng hoá thông thường không có hạn sử dụng nhưng cần tránh tồn cũ.

3. Truy cập module & các tab

Vào ứng dụng tại app.opsoneai.com → bấm 📦 Kho vận trên sidebar bên trái. Module gồm các tab sau (tab hiện ra tuỳ quyền và gói plan):

TabMục đíchĐối tượng dùng
📊 Tổng quanDashboard: số kho, số SKU, tồn, giá trị, đơn chờ, biểu đồ giao dịch 30 ngày.Quản lý kho, giám đốc
🏭 Kho hàngCRUD kho: tên, địa chỉ, người phụ trách, kho mặc định.Admin
📦 Tồn khoXem tồn theo SKU × kho, cảnh báo low-stock, bulk adjust, transfer.NV kho, mua hàng
📤 Lấy hàngPick list từ đơn đã xác nhận, scan vị trí, đóng gói, ship.NV đóng gói
↩️ Trả hàngTiếp nhận hàng trả, kiểm tra, duyệt cộng tồn hoặc loại huỷ.NV kho, CSKH
📥 Xếp khoQuy tắc auto-suggest vị trí khi nhập hàng mới.Admin kho
🎯 Gán vị trí (quét)Workflow di động: nhân viên quét SKU → quét bin → gán xong.NV kho
📋 Phiếu nhập khoStock request: phiếu yêu cầu nhập/xuất/chuyển có duyệt.NV kho, quản lý
📜 Giao dịchLịch sử mọi nhập/xuất/chuyển/kiểm kê có thể lọc và export CSV.Kế toán, kiểm toán
🏷 Mã vạchSinh barcode SKU, in label, gán/sửa barcode mapping.NV kho
📋 Kiểm kêTạo kế hoạch kiểm kê, đếm hàng, đối chiếu, sinh adjustment.Kế toán, NV kho
🧠 Phân tíchABC, hàng cần nhập, hàng chết, aging, lifecycle, pricing, AI gợi ý.Giám đốc, mua hàng
Mẹo phân quyền: Mỗi tab gắn permission riêng (warehouse_inventory, warehouse_picking, warehouse_putaway, warehouse_stocktake, warehouse_barcode, warehouse_transactions, warehouse_returns, warehouse_analytics). Admin có thể cấp lẻ từng tab cho từng vai trò (vd: nhân viên đóng gói chỉ thấy Pick list).

4. Tồn kho (Inventory)

Đây là tab dùng nhiều nhất hằng ngày. Anh/chị xem được toàn bộ tồn kho theo kho × SKU, biết ngay SKU nào sắp hết, có thể adjust hàng loạt hoặc chuyển kho ngay tại bảng.

📦
Tab Tồn kho
Xem tồn theo kho, bin, SKU; bulk adjust; transfer giữa kho

Các cột tồn kho

  • Tồn vật lý (on_hand) — số lượng đang nằm thực trong kho.
  • Có thể bán (available_qty) — on_hand - committed - picking, dùng để chốt đơn mới.
  • Giữ hàng (committed_qty) — đơn đã chốt, đang chờ đóng gói.
  • Đang lấy (picking_qty) — pick list đã bắt đầu lấy.
  • Đang giao (shipping_qty) — đã đóng gói và bàn giao shipper.

Các thao tác chính

  1. Lọc theo kho, bin, danh mục, từ khoá SKU/tên/barcode.
  2. Sort theo tồn, giá trị, ngày cập nhật.
  3. Adjust nhanh: bấm số lượng → nhập số mới → ghi lý do → tạo transaction kiểu adjust.
  4. Transfer: chọn nhiều dòng → bấm "Chuyển kho" → chọn kho đích → hệ thống tạo cặp giao dịch outbound + inbound.
  5. Export CSV: toàn bộ tồn theo bộ lọc hiện tại, kèm giá vốn nếu có quyền view_cost.

Cảnh báo Low-Stock (reorder point)

Mỗi inventory item có 2 ngưỡng cấu hình: min_qty (mức tối thiểu) và max_qty (mức tối đa). Khi available_qty ≤ min_qty → SKU vào danh sách "🚨 Cần nhập". Hệ thống có 1 endpoint GET /api/warehouse/reorder/:projectId trả về tất cả SKU đang dưới ngưỡng, kèm tốc độ tiêu thụ 30 ngày gần nhất để đề xuất số lượng cần đặt.

Lưu ý: Nếu min_qty = 0 nghĩa là tắt cảnh báo cho SKU đó. Anh/chị nên đặt min_qty cho ít nhất top 20% SKU bán chạy (theo phân tích ABC) để không bị out-of-stock.

Lot / Batch view (khi bật)

Nếu doanh nghiệp bật lot tracking trong cấu hình SKU, tab Tồn kho sẽ hiện thêm panel mở rộng cho từng SKU — liệt kê các lô đang còn, số lượng, ngày sản xuất, hạn sử dụng. Lô có HSD < 60 ngày sẽ tô vàng, < 14 ngày tô đỏ.

5. Giao dịch kho (Stock Transactions)

Đây là "sổ cái" của kho — mọi nhập/xuất/chuyển/kiểm kê/trả hàng đều ghi 1 dòng vào đây. Tab này chính là chỗ kế toán đối soát và kiểm toán truy vết.

📜
Tab Giao dịch
Lịch sử bất biến — không sửa, chỉ reverse

Các loại giao dịch (tx_type)

LoạiHướngNguồn sinh ra
Nhận hàng vào khoinboundNhận từ PO mua hàng
Đóng gói & xuất kho đơn hàngoutboundPick list ship xong
Chuyển kho nội bộtransferBấm "Chuyển kho" từ tab Tồn kho
Trả hàng NCCoutboundTab Mua hàng — Returns
Nhận hàng trả lạiinboundTab Trả hàng (khách hàng)
Huỷ giao hànginboundĐơn bị huỷ — cộng lại tồn
Điều chỉnh kiểm kêadjustSinh từ Stocktake
Khởi tạo tồn khoinboundSetup ban đầu khi go-live

Trường source

Mỗi transaction có trường source để truy ngược nguồn gốc: sapo (đồng bộ từ Sapo POS), manual (do người dùng tự nhập), transfer, return, stocktake, system (job tự động).

Reverse Transaction

Khi cần huỷ 1 giao dịch sai (vd: nhập nhầm số lượng), KHÔNG sửa trực tiếp record cũ. Anh/chị bấm "Đảo chiều" — hệ thống sinh 1 transaction ngược dấu với reverse_of trỏ về record gốc. Cả 2 dòng cùng tồn tại trong sổ — đảm bảo audit trail.

Đồng bộ Sapo: Khi bật Sapo Sync, scheduler sẽ tự động đọc orders mới từ Sapo và sinh stock_transactions tương ứng (kiểu outbound, source = sapo). Nếu Sapo đẩy đơn mà tồn không trừ → kiểm tra: (1) scheduler còn chạy không, (2) inventory_items có map đúng sapo_id chưa.

Export & Filter

Hỗ trợ lọc theo: khoảng thời gian, kho, SKU, loại transaction, source, người tạo. Bấm "Export CSV" tải toàn bộ giao dịch theo bộ lọc — file có UTF-8 BOM, mở trực tiếp được trong Excel có dấu tiếng Việt.

6. Lấy hàng & Đóng gói (Picking)

Sau khi đơn hàng được chốt và xác nhận, hệ thống tự động sinh pick list để nhân viên kho thực hiện lấy hàng. Pick list chính là cầu nối giữa CRM/Sales và Kho.

📤
Tab Lấy hàng
Pick list → Picking → Picked → Packed → Shipped

Quy trình 5 bước

  • Sinh pick list — từ đơn đã xác nhận. Có thể tạo 1 pick list / 1 đơn hoặc gộp nhiều đơn (batch pick).
  • Start picking — nhân viên mở pick list trên di động, hệ thống chuyển status pending → picking, đồng thời cộng picking_qty ở inventory để chặn oversell.
  • Scan item — quét barcode SKU + barcode vị trí cho từng dòng. Sai SKU → app báo lỗi đỏ.
  • Packed — đóng gói xong, in shipping label nếu có tích hợp ĐVVC.
  • Shipped — bàn giao shipper. Status thành shipped, sinh transaction outbound, trừ tồn vật lý.

Status flow

1
📋
pending
2
🚶
picking
3
✅
picked
4
📦
packed
5
🚚
shipped

Hủy pick list

Pick list có thể huỷ ở bất kỳ status nào TRƯỚC khi shipped. Khi huỷ, anh/chị bắt buộc ghi reason (lý do) — hệ thống lưu vào audit trail và rollback các phản ánh tồn (trả lại committed/picking).

Đã ship rồi thì sao? Pick list đã shipped KHÔNG huỷ trực tiếp được. Phải xử lý qua quy trình Trả hàng (Returns) — khách trả về kho, kho duyệt cộng tồn lại.

Dashboard pick list

Endpoint GET /api/picking/:projectId/stats/dashboard trả về số liệu: pending, picking, picked, packed, shipped, cancelled theo ngày — phục vụ KPI cho leader kho.

7. Quy tắc xếp kho (Putaway)

Khi hàng mới về (từ PO mua hàng), nhân viên cần biết "đưa hàng này vào kệ nào?". Quy tắc Putaway giúp hệ thống tự gợi ý vị trí — giảm phụ thuộc kinh nghiệm cá nhân, giảm sai sót.

📥
Tab Xếp kho
Cấu hình rule + workflow scan di động

Các trường rule

  • Tên rule — vd "Hàng lạnh → khu A1".
  • Điều kiện — kết hợp 1-3 yếu tố:
    • Theo SKU cụ thể (vd: SKU "MILK-100ML")
    • Theo danh mục (vd: "Thực phẩm đông lạnh")
    • Theo nhà cung cấp (vd: "NCC Vinamilk")
  • Vị trí gợi ý — bin cụ thể hoặc nhóm bin (vd: "A1-*", "Khu lạnh").
  • Ưu tiên — số nhỏ hơn ưu tiên hơn. Khi nhiều rule match cùng 1 SKU, hệ thống chọn rule priority thấp nhất.

Workflow Putaway Scan

  1. Nhân viên mở tab "🎯 Gán vị trí (quét)" trên di động.
  2. Quét barcode SKU → hệ thống tra rule → gợi ý 1-3 vị trí phù hợp.
  3. Nhân viên đi đến vị trí gợi ý, quét barcode bin để xác nhận.
  4. Nhập số lượng → bấm "Lưu" → tồn kho cộng vào bin đó.
Endpoint: GET /api/putaway/:projectId/suggest?sku=... trả về danh sách vị trí gợi ý theo rule. PUT /api/putaway/:projectId/assign ghi nhận hàng đã gán vào bin.

8. Kiểm kê (Stocktake)

Kiểm kê là "khám sức khoẻ" định kỳ của kho — đối chiếu sổ sách với thực tế. OpsOne hỗ trợ kiểm kê toàn kho, kiểm kê 1 khu vực, hoặc cycle count (mỗi ngày đếm 1 nhóm SKU theo vòng).

📋
Tab Kiểm kê
Plan → Count → Variance → Adjustment

Quy trình 5 bước

  • Tạo phiếu kiểm kê — chọn kho, phạm vi (toàn bộ / theo bin / theo danh mục), ngày dự kiến đếm.
  • Hệ thống snapshot — chốt số tồn sổ sách (book qty) tại thời điểm tạo phiếu, để so sánh sau.
  • Nhân viên đếm — quét barcode SKU / bin trên di động, nhập số đếm thực tế. Có thể chụp ảnh làm bằng chứng.
  • Variance report — hệ thống tính lệch (counted - book), tô đỏ SKU lệch, kèm % lệch.
  • Adjustment — Admin duyệt → sinh transaction kiểu stocktake để cộng/trừ tồn theo số đếm thực, kèm lý do (vd: "hao hụt tự nhiên", "mất cắp", "đếm sót").

Cycle Count

Endpoint POST /api/returns/:projectId/cycle-count tạo phiếu kiểm kê vòng — mỗi ngày 1 nhóm SKU (chia theo ABC: hàng A đếm tuần, hàng B đếm tháng, hàng C đếm quý). Cách này nhẹ nhàng hơn kiểm kê toàn kho cuối năm và phát hiện sai lệch sớm hơn.

Lệch kiểm kê > 5% cần escalate lên quản lý. Mọi adjustment đều ghi audit trail (ai duyệt, lúc nào, lý do gì) — phục vụ kiểm toán.

9. Serial / IMEI

Áp dụng cho hàng có số seri duy nhất: xe máy, điện thoại, điện tử, máy móc công nghiệp, hàng bảo hành. Mỗi serial là 1 đơn vị độc lập có thể track xuyên suốt vòng đời.

🔖
Quản lý Serial / IMEI
Track từng đơn vị + gắn vào order line

Trạng thái serial

  • in_stock — đang trong kho, sẵn sàng bán.
  • sold — đã bán, gắn vào order line.
  • warranty — khách mang về bảo hành, đang ở kho dịch vụ.
  • disposed — huỷ/loại bỏ (hỏng không sửa được, mất, v.v.).

Nhập serial hàng loạt

Endpoint POST /api/serial/:projectId/bulk cho phép nhập 1 danh sách serial cùng SKU 1 lúc — vd: nhập 50 chiếc xe máy cùng model. Hệ thống tự sinh transaction inbound + tạo serial records với status in_stock.

Lookup serial

GET /api/serial/:projectId/lookup/:serial — quét serial bất kỳ → trả về toàn bộ thông tin: SKU, trạng thái, ngày nhập, đơn bán (nếu sold), lịch sử bảo hành.

Gắn vào order line

Khi bán hàng có serial, lúc đóng gói nhân viên phải scan serial → app verify serial đang in_stock và cùng SKU với order line → gắn serial vào order line → chuyển status sang sold.

Nhập nhầm serial vào đơn sai? Mở chi tiết đơn → Edit serial của line đó → app chuyển serial cũ về in_stock, serial mới về sold. Toàn bộ thao tác có audit log.

10. Mã vạch (Barcode)

Mã vạch là "ngôn ngữ" của kho hiện đại — quét nhanh hơn gõ tay 10 lần, sai sót gần như bằng 0. OpsOne hỗ trợ sinh barcode tự động, in label, và quét bằng app di động.

🏷
Tab Mã vạch
Generate · Map · Print · Scan

Sinh barcode

  • Một SKU: POST /api/warehouse/barcode/generate/:projectId — sinh barcode EAN-13 tự động cho SKU chưa có.
  • Hàng loạt: POST /api/warehouse/barcode/generate-all/:projectId — sinh cho tất cả SKU đang thiếu barcode.
  • Gán thủ công: PUT /api/warehouse/barcode/assign/:id — nếu nhà cung cấp đã có barcode in sẵn, anh/chị nhập tay vào.

In label

Bấm "In label" trong tab → chọn cỡ giấy (thường A4 chia 30 ô hoặc decal Brother 38×25 mm) → hệ thống render PDF có barcode + tên SKU + giá → in.

Lookup barcode

GET /api/warehouse/barcode/lookup/:projectId/:barcode — quét barcode bất kỳ → trả về SKU, tồn kho, giá. Endpoint này dùng cho POS, pick list, putaway, kiểm kê.

Mẹo: Mỗi vị trí (bin) cũng nên có 1 barcode dán tại kệ — workflow scan SKU + scan bin giúp nhân viên không nhầm vị trí. Endpoint GET /api/warehouse/location/lookup/:projectId/:barcode lookup vị trí từ barcode.

11. Trả hàng (Returns)

Khách hàng trả hàng là chuyện không tránh khỏi. Tab Trả hàng giúp anh/chị quản lý quy trình: tiếp nhận → kiểm tra → quyết định cộng tồn hay huỷ → cập nhật doanh thu/công nợ.

↩️
Tab Trả hàng
Receive → Inspect → Approve/Reject → Restock

Quy trình 4 bước

  • Tạo phiếu trả — chọn đơn gốc, chọn line trả về, số lượng, lý do (lỗi, không thích, ship sai...). Phiếu có status pending.
  • Kiểm tra — NV kho mở phiếu → bấm "Inspect" → ghi nhận tình trạng (mới nguyên / xước nhẹ / hỏng / mất phụ kiện). Hỗ trợ upload ảnh làm bằng chứng. PUT /api/returns/:projectId/:id/inspect
  • Admin duyệt — bấm "Approve" + chọn xử lý: Cộng tồn (hàng còn nguyên, restock) hoặc Loại huỷ (hàng hỏng, disposed). PUT /api/returns/:projectId/:id/approve
  • Sinh transaction — nếu cộng tồn → sinh "Nhận hàng trả lại" inbound. Nếu disposed → sinh outbound vào "kho huỷ" để vẫn ghi sổ.

Damaged list

GET /api/returns/:projectId/damaged/list — danh sách hàng hỏng đang chờ xử lý (gửi NCC bảo hành, sửa, thanh lý...). PUT /api/returns/:projectId/damaged/:id/resolve để kết thúc record.

ABC Returns Analyze

GET /api/returns/:projectId/abc/analyze — phân tích tỷ lệ trả hàng theo SKU. SKU có % trả cao bất thường → cần review chất lượng hoặc mô tả sản phẩm.

Reject return chỉ dùng khi khách yêu cầu trả nhưng không hợp lệ (quá hạn, không có hoá đơn). Reject phải kèm reason rõ ràng để CSKH giải thích với khách.

12. Phân tích kho (Analytics)

Tab "🧠 Phân tích" tổng hợp các insight quan trọng để anh/chị ra quyết định mua hàng, thanh lý, định giá. Có 9 sub-tab: Tổng quan, ABC, Cần nhập, Hàng chết, Hoàn trả, Thất thoát, Lifecycle, Giá, Tuổi tồn.

🧠
Tab Phân tích
9 góc nhìn + AI Gemini gợi ý hành động

Các góc nhìn chính

Sub-tabTrả lời câu hỏi
📊 Tổng quanTồn tổng, giá trị tồn, số SKU active, tốc độ luân chuyển (turnover).
🏆 ABCSKU nào tạo 80% doanh thu (A), 15% (B), 5% (C)? Hàng A cần ưu tiên không out-of-stock.
🚨 Cần nhậpSKU đang dưới ngưỡng min, kèm tốc độ tiêu thụ → đề xuất số lượng cần đặt.
💀 Hàng chếtSKU không bán được trong N ngày (mặc định 90). Đề xuất thanh lý, discount, ngừng nhập.
📦 Hoàn trả% trả theo SKU, lý do trả phổ biến.
⚠️ Thất thoátVariance kiểm kê tích luỹ — phát hiện rò rỉ, mất cắp.
📈 LifecyclePha vòng đời SKU: introduction → growth → mature → decline.
💰 GiáSo sánh giá vốn vs giá bán, biên lợi nhuận theo SKU.
⏳ Tồn theo tuổi (aging)Tồn đang nằm trong kho bao lâu: 0-30 / 31-60 / 61-90 / 90+ ngày. Hàng tồn lâu = rủi ro.

AI Analyze & Forecast

POST /api/warehouse/ai/analyze/:projectId chạy Gemini đọc tồn + lịch sử bán → sinh nhận xét tổng quát: SKU nào cần ưu tiên, kho nào quá tải, đề xuất rebalancing.

POST /api/warehouse/ai/forecast/:projectId dự báo mua hàng 30/60/90 ngày tới dựa trên tốc độ bán + tồn hiện tại + min_qty. Có thể bấm "Tạo Purchase Request" để xuất luôn PR sang module Mua hàng.

Dead-stock alert: Mỗi tuần, hệ thống gửi báo cáo SKU không có giao dịch outbound trong 90 ngày → admin quyết định: giảm giá xả, gói combo, hay loại khỏi catalog.

Tình huống thực tế

Tình huống 1 — Cửa hàng bán lẻ 1 kho cơ bản

Bối cảnh: Shop quần áo có 1 cửa hàng tại HCM, kho ngay tại shop, 500 SKU, không cần lot/serial. Mục tiêu: biết tồn chính xác, không out-of-stock hàng bán chạy, tránh tồn dư hàng ế.

Cấu hình tối thiểu
Bật: Tồn kho · Giao dịch · Mã vạch · Phân tích
1 kho "HCM-Shop1"→ Gán min_qty cho 100 SKU bán chạy→ Generate barcode all→ In label dán lên hàng
  • Hằng ngày: bán hàng qua POS → tự trừ tồn. Cuối ngày check tab "🚨 Cần nhập".
  • Hàng tuần: mở "💀 Hàng chết" → SKU 90 ngày không bán → discount 30% xả.
  • Hàng tháng: kiểm kê cycle count theo phân tích ABC.

Tình huống 2 — Doanh nghiệp phân phối 3 kho có transfer thường xuyên

Bối cảnh: Công ty phân phối thiết bị có 3 kho (HCM, HN, ĐN), 2.000 SKU, mỗi tuần chuyển hàng nội bộ 1-2 chuyến. Mục tiêu: biết tồn từng kho, transfer dễ dàng, phân tích kho nào dư/thiếu.

Cấu hình mở rộng
Bật: Tồn kho · Lấy hàng · Xếp kho · Giao dịch · Mã vạch · Kiểm kê · Phân tích · Putaway scan
3 kho + bin từng kho→ Putaway rule theo danh mục→ Pick list tự sinh khi chốt đơn→ Transfer định kỳ T6
  • Mỗi sáng T6: quản lý kho HCM mở "🧠 Phân tích" → kho nào dư SKU X, kho nào thiếu → tạo Transfer Request.
  • Transfer flow: Tạo phiếu chuyển → kho gửi pack + ship → kho nhận inbound + putaway scan.
  • KPI: Tốc độ pick (đơn/giờ/người), tỷ lệ pick chính xác (≥ 99.5%), tồn dư theo kho.

Tình huống 3 — Doanh nghiệp thực phẩm cần FEFO + lot tracking

Bối cảnh: Công ty nhập khẩu thực phẩm chức năng, 300 SKU, mỗi SKU có 3-5 lô đang còn trong kho với HSD khác nhau. Mục tiêu: không bao giờ giao hàng sắp hết hạn cho khách lớn; truy vết lô khi có recall.

Cấu hình lot tracking
Bật: Tồn kho · Lot/Batch · Lấy hàng FEFO · Kiểm kê · Mã vạch · Phân tích aging
Bật lot_tracking ở SKU→ Nhập kho ghi lô + HSD→ Pick list auto FEFO→ Báo cáo aging hằng tuần
  • Khi nhập kho: nhân viên scan SKU + nhập lot code + HSD + số lượng. Hệ thống tạo inventory record gắn lot.
  • Khi pick: hệ thống ưu tiên gợi ý lô có HSD gần nhất (FEFO). Nhân viên scan đúng lô để xác nhận.
  • Aging report: SKU có HSD < 60 ngày → discount; < 14 ngày → block bán cho khách doanh nghiệp, chỉ bán lẻ + ghi rõ.
  • Recall: Truy vết "Lô LOT-2026-05-A đã bán cho ai?" → query stock_transactions có lot_id → danh sách đơn → khách hàng.

Câu hỏi thường gặp

Sapo đẩy đơn nhưng tồn kho không trừ?

Kiểm tra theo thứ tự:

  1. Scheduler còn chạy không? Vào tab "🔗 Sapo Sync" → xem last_sync_at. Nếu > 1 giờ, restart scheduler hoặc kiểm tra PM2 logs.
  2. SKU đã map sapo_id chưa? Mở inventory_items của SKU đó → kiểm tra trường sapo_id phải có giá trị. Nếu null → vào Sapo Sync → "Map lại SKU".
  3. Status transaction là gì? Vào tab Giao dịch lọc source = sapo theo ngày → nếu KHÔNG thấy transaction tương ứng đơn → scheduler chưa đọc tới. Nếu CÓ transaction nhưng tồn không đổi → có thể do reverse_of đã đảo dấu.
Multi-warehouse — đơn mới chốt sẽ trừ vào kho nào?

Theo thứ tự ưu tiên:

  1. Nếu đơn có chỉ định kho cụ thể trong order metadata → dùng kho đó.
  2. Nếu khách hàng có kho mặc định (vd: khách HCM gắn với kho HCM) → dùng kho đó.
  3. Nếu không có → dùng kho mặc định của project (đánh dấu is_default = 1 trong tab Kho hàng).

Nếu kho được chọn KHÔNG đủ tồn → hệ thống cảnh báo và đề xuất kho khác có đủ. Admin có thể bật rule "auto split" để chia đơn ra nhiều kho cùng giao.

Lô hàng FEFO — hệ thống có tự xuất lô hết hạn trước không?

Có. Khi pick list được sinh cho SKU có lot tracking, hệ thống tự sắp thứ tự lô theo HSD tăng dần (lô sắp hết hạn xếp đầu) và gợi ý nhân viên lấy lô đầu tiên. Nhân viên scan lot code để xác nhận đúng. Nếu lô đầu không đủ số lượng, hệ thống tự đề xuất bổ sung từ lô kế tiếp.

Nếu doanh nghiệp muốn FIFO thay vì FEFO (vd: hàng không HSD), vào cấu hình SKU → đổi rotation_method sang FIFO.

Serial nhập nhầm vào đơn sai — làm sao gỡ?

Mở chi tiết đơn → tab "Serial/IMEI" của đơn → bấm "Sửa serial" trên line bị nhầm → quét hoặc nhập serial đúng → bấm Lưu. Hệ thống:

  1. Chuyển serial cũ về in_stock (có sẵn để bán tiếp).
  2. Chuyển serial mới về sold (gắn với đơn này).
  3. Ghi audit log: ai sửa, lúc nào, từ serial X → serial Y.

Nếu đơn đã ship và khách đã nhận hàng → KHÔNG sửa serial trên hệ thống nữa (sai lệch với thực tế khách đang giữ). Phải xử lý qua quy trình bảo hành/đổi trả.

Pick list đã ship rồi có hủy được không?

Không huỷ trực tiếp được. Phải xử lý qua quy trình Trả hàng:

  1. Liên hệ shipper / khách thu hồi hàng.
  2. Khi hàng về kho → tạo phiếu trả (Returns) liên kết với đơn gốc.
  3. NV kho inspect → admin duyệt → cộng tồn (nếu hàng còn nguyên) hoặc disposed (nếu đã hỏng).
  4. Đơn gốc sẽ có liên kết tới phiếu trả — kế toán có cơ sở refund cho khách.
Kiểm kê phát hiện lệch lớn — xử lý sao?

Theo % lệch:

  • Lệch < 1%: sai số đếm thường gặp → admin duyệt adjustment, lý do "sai số đếm".
  • Lệch 1-5%: đếm lại lần 2 để chắc chắn → nếu vẫn lệch, ghi lý do "hao hụt tự nhiên" (đối với hàng dễ vỡ, dễ bay hơi).
  • Lệch > 5%: escalate lên giám đốc + báo CSO. Kiểm tra camera, audit log thao tác kho, check transaction outbound bất thường. Khả năng cao là: thất thoát/mất cắp, nhập sai data ban đầu, hoặc lỗi sync (vd: Sapo đẩy thiếu đơn).

Mọi adjustment dù lý do gì cũng ghi audit trail và có sub-tab "⚠️ Thất thoát" trong Phân tích để theo dõi xu hướng.

Quy tắc xếp kho — ưu tiên theo gì khi nhiều rule cùng match?

Hệ thống chọn rule có giá trị priority nhỏ nhất (priority = 1 ưu tiên hơn priority = 10).

Nguyên tắc đặt priority:

  • 1-10: rule theo SKU cụ thể (cụ thể nhất, ưu tiên cao nhất).
  • 11-50: rule theo danh mục (vd: "Hàng lạnh → khu A1").
  • 51-100: rule theo nhà cung cấp.
  • 101+: rule fallback (vd: "Bất kỳ → khu chờ").

Khi nhiều rule cùng priority match, hệ thống chọn rule tạo gần nhất (updated_at mới nhất).

Quyền nào cần để dùng module này?

Mỗi tab gắn permission riêng để admin cấp lẻ:

  • warehouse — Tổng quan + Kho hàng.
  • warehouse_inventory — Tồn kho + Phiếu nhập.
  • warehouse_picking — Lấy hàng & đóng gói.
  • warehouse_putaway — Xếp kho.
  • warehouse_stocktake — Kiểm kê.
  • warehouse_transactions — Lịch sử giao dịch.
  • warehouse_barcode — Mã vạch.
  • warehouse_returns — Trả hàng.
  • warehouse_analytics — Phân tích.

Để xem giá vốn (cost_price, biên lợi nhuận) cần thêm quyền view_cost. Không có quyền này, các cột giá vốn sẽ bị che.

Sẵn sàng vận hành kho chuyên nghiệp?

Mở app, vào Kho vận, bắt đầu với cấu hình tối thiểu cho 1 kho — anh/chị có thể nâng dần lên multi-warehouse, lot và serial khi quy mô lớn lên.

Mở app OpsOne Xem tất cả hướng dẫn
Dùng OpsOne trên điện thoại
Quét mã bằng camera, chấm công GPS kèm ảnh, mở khoá bằng vân tay.
App Store Google Play