# Xuất/Nhập kho Logistic



# Hướng dẫn nhập kho PackingList (LOGISTIC)

## 1) Mục đích

Tài liệu này hướng dẫn người dùng thao tác chức năng **Nhập kho Packing List** trên WMS, gồm:
- Tìm kiếm và theo dõi lịch sử nhập kho theo từng Packing List
- Tạo phiếu nhập kho mới bằng quét mã/QR
- Kiểm tra điều kiện hợp lệ khi quét
- Nhập số lượng thực nhập, ghi chú, xác nhận lưu
- Hiểu kết quả sau khi lưu và các thông báo lỗi thường gặp

## 2) URL truy cập

- Menu: `Kho` -> `Lịch sử nhập kho`
- Route: <a target="__blank" href="https://logistic-client.datacenter.tms-s.vn/vi/warehouse-entry">https://logistic-client.datacenter.tms-s.vn/vi/warehouse-entry</a>

## 3) Mục lục

- Truy cập chức năng
- Tìm kiếm và xem lịch sử nhập kho
- Tạo phiếu nhập kho mới
- Điều kiện quét hợp lệ/không hợp lệ
- Quy tắc nhập số lượng và xác nhận lưu
- Kết quả sau khi lưu
- Các thông báo lỗi thường gặp
- Các trường/hành vi bị khóa hoặc giới hạn thao tác

## 4) Truy cập chức năng

1. Mở menu **Kho**.
2. Chọn **Lịch sử nhập kho**.
3. Màn hình hiển thị dạng 2 cột:
   - Cột trái: danh sách Packing List đã/đang có lịch sử nhập kho
   - Cột phải: chi tiết lịch sử theo Packing List đang chọn
4. Bấm **Nhập kho** để mở popup tạo phiếu nhập mới.

## 5) Tìm kiếm và xem lịch sử nhập kho theo Packing List

### 5.1 Tìm kiếm danh sách

- Ô tìm kiếm hỗ trợ theo:
  - Mã Packing List / Invoice No
  - Mã nhập kho
  - Tên người nhận
  - Tên người nhập kho
  - Mã / tên đơn hàng
- Dữ liệu danh sách được phân trang.

### 5.2 Đọc trạng thái nhanh trên danh sách

- Mỗi dòng Packing List hiển thị:
  - Mã Invoice + mã Packing List
  - Người nhận
  - Tiến độ `Đã nhập / Cần nhập`
- Màu sắc thể hiện mức hoàn thành:
  - Đủ số lượng: xanh
  - Chưa đủ: cam

### 5.3 Xem chi tiết lịch sử nhập

Khi chọn 1 Packing List:
- Header chi tiết hiển thị:
  - Tổng đơn hàng
  - `Đã nhập / Cần nhập`
  - Tổng thùng
  - Tổng lượt nhập
- Bên dưới là danh sách từng phiếu nhập kho (mỗi phiếu có mã nhập kho, người nhập, thời gian).
- Mỗi phiếu có thể mở/thu gọn để xem chi tiết theo thùng và đơn hàng:
  - Mã đơn hàng
  - SKU
  - SL cần
  - SL nhập
  - Ghi chú

## 6) Tạo phiếu nhập kho mới (quét mã, chọn danh sách, nhập SL thực nhập, ghi chú)

### 6.1 Mở popup nhập kho

1. Bấm nút **Nhập kho**.
2. Popup hiển thị:
   - Cột trái: ô quét/nhập mã + danh sách Packing List đã quét
   - Cột phải: chi tiết thùng và đơn hàng để nhập số lượng

### 6.2 Quét hoặc nhập mã Packing List

1. Nhập mã hoặc quét QR vào ô quét.
2. Nhấn Enter hoặc bấm icon tìm kiếm.
3. Nếu hợp lệ, Packing List được thêm vào danh sách đã quét.
4. Hệ thống tự chọn Packing List mới quét để thao tác ngay.

### 6.3 Nhập số lượng thực nhập

- Theo từng đơn hàng trong từng thùng:
  - Nhập **SL thực nhập**
  - Nhập **Ghi chú** (nếu cần)
- Có thể xóa:
  - Cả Packing List đã quét
  - Một thùng trong Packing List
  - Một dòng đơn hàng trong thùng

### 6.4 Xác nhận lưu

1. Bấm **Xác nhận nhập kho (x PL)**.
2. Popup xác nhận hiển thị tổng:
   - Số Packing List đang chuẩn bị nhập
   - Tổng `thực nhập / cần nhập`
3. Bấm xác nhận để lưu.

## 7) Điều kiện quét hợp lệ/không hợp lệ

## 7.1 Trường hợp hợp lệ

Packing List chỉ được thêm vào danh sách quét khi:
- Không phải Packing List Customer
- Không trùng với Packing List đã quét trong phiên hiện tại
- Đã xuất thành phẩm thành công từ TTD
- Tìm thấy dữ liệu từ hệ thống

## 7.2 Trường hợp không hợp lệ

Các trường hợp bị chặn khi quét:
- **Trùng mã đã quét**
- **Packing List Customer**
- **Không tìm thấy mã**
- **Đã xuất kho thành phẩm bên Logistic.**
- **Sai process** (chưa đạt điều kiện nghiệp vụ để nhập kho)

## 8) Quy tắc nhập số lượng 

- Mỗi dòng đơn hàng phải nhập số lượng số nguyên không âm.
- Hệ thống mặc định đề xuất SL thực nhập theo công thức:
  - `SL đề xuất = SL cần - SL đã nhập trước đó`
- Khi bấm lưu:
  - Nếu có bất kỳ dòng nào có SL thực nhập = 0 -> không cho lưu
  - Nếu không còn dữ liệu hợp lệ để lưu -> không cho lưu


## 9) Kết quả sau khi lưu

Khi lưu thành công:
- Popup đóng
- Màn hình lịch sử tự tải lại dữ liệu
- Packing List vừa nhập phản ánh lại:
  - Tổng đã nhập
  - Tổng cần nhập
  - Số lượt nhập
  - Danh sách phiếu nhập mới trong phần chi tiết

## 10) Các thông báo lỗi thường gặp

- `Packing List {code} đã được quét`
- `Vui lòng không quét Packing List Customer!`
- `Không tìm thấy Packing List với mã đã nhập`
- `Packing List chưa được xuất kho thành phẩm. Vui lòng xuất kho thành phẩm trước khi nhập kho!`
- `Packing List đã được xuất kho thành phẩm. Vui lòng không nhập kho!`
- `Không thể tìm kiếm Packing List`
- `Vui lòng quét Packing List trước khi lưu`
- `Vui lòng nhập số lượng lớn hơn 0 cho tất cả đơn hàng`
- `Không có dữ liệu hợp lệ để lưu`
- `Không thể lưu nhập kho` (hoặc thông báo lỗi backend trả về)

## 11) Các trường/hành vi bị khóa hoặc giới hạn thao tác

- Nút **Nhập kho** bị khóa nếu người dùng không có quyền chỉnh sửa.
- Không có quyền truy cập khi không khó quyền **View**
- Nút **Xác nhận nhập kho** bị khóa khi:
  - Không có Packing List nào đã quét
  - Đang trong quá trình lưu
  - Người dùng không có quyền chỉnh sửa
- Không thể đóng popup bằng ESC hoặc click ra ngoài (tránh mất dữ liệu nhập).
- Trường SL thực nhập chỉ cho nhập ký tự số, giới hạn tối đa 11 chữ số.
- Ghi chú mỗi dòng giới hạn 255 ký tự.

## 12) Link diagram tham chiếu

- Diagram chi tiết (draw.io): [warehouseentry-data.drawio](https://drive.google.com/file/d/1iHnqv4IiklXjm2Dp283T4sVMP3sWAaKL/view?usp=sharing)



[![Screenshot from 2026-03-23 05-09-33.png](https://book.app.tms-s.vn/uploads/images/gallery/2026-03/scaled-1680-/screenshot-from-2026-03-23-05-09-33.png)](https://book.app.tms-s.vn/uploads/images/gallery/2026-03/screenshot-from-2026-03-23-05-09-33.png)

# Hướng dẫn xuất kho Packing List

# Hướng dẫn sử dụng — Chức năng Xuất Kho Packing List

---

## Mục lục

1. [Mục đích](#1-mục-đích)
2. [URL truy cập](#2-url-truy-cập)
3. [Truy cập chức năng](#3-truy-cập-chức-năng)
4. [Tìm kiếm và xem lịch sử xuất kho theo Packing List](#4-tìm-kiếm-và-xem-lịch-sử-xuất-kho-theo-packing-list)
5. [Tạo phiếu xuất kho mới](#5-tạo-phiếu-xuất-kho-mới)
6. [Điều kiện quét hợp lệ và không hợp lệ](#6-điều-kiện-quét-hợp-lệ-và-không-hợp-lệ)
7. [Quy tắc nhập số lượng và xác nhận lưu](#7-quy-tắc-nhập-số-lượng-và-xác-nhận-lưu)
8. [Kết quả sau khi lưu](#8-kết-quả-sau-khi-lưu)
9. [Các thông báo lỗi thường gặp](#9-các-thông-báo-lỗi-thường-gặp)
10. [Các trường và hành vi bị khóa hoặc giới hạn thao tác](#10-các-trường-và-hành-vi-bị-khóa-hoặc-giới-hạn-thao-tác)

---

## 1. Mục đích

Chức năng **Xuất kho Packing List** cho phép nhân viên kho ghi nhận việc xuất hàng thực tế ra khỏi kho theo từng Packing List (PKL). Sau khi xác nhận, hệ thống tự động:

- Tạo phiếu xuất kho có mã định danh riêng.
- Trừ số lượng hàng đã xuất khỏi tồn kho.
- Ghi lịch sử xuất để tra cứu về sau.

---

## 2. URL truy cập

| Ngôn ngữ | Đường dẫn |
|---|---|
| Tiếng Việt | `/vi/warehouse-export` |
| Tiếng Anh | `/en/warehouse-export` |

---

## 3. Truy cập chức năng

### Yêu cầu quyền

Tài khoản đăng nhập phải được cấp **quyền `View`** đối với trang `/warehouse-export`. Nếu không có quyền, hệ thống hiển thị trang **"Từ chối truy cập"** và không cho phép vào.

Để thực hiện tạo phiếu xuất, tài khoản cần thêm **quyền `Edit`**. Nếu chỉ có quyền `View`, nút **"Xuất kho mới"** sẽ bị vô hiệu hóa (màu xám, không bấm được).

### Cách truy cập

1. Đăng nhập vào hệ thống.
2. Trên thanh điều hướng bên trái, chọn **"Xuất kho"**.
3. Trang hiển thị giao diện chia hai cột:
   - **Cột trái:** Danh sách Packing List đã và đang được xuất kho.
   - **Cột phải:** Chi tiết lịch sử xuất của Packing List đang chọn.

---

## 4. Tìm kiếm và xem lịch sử xuất kho theo Packing List

### Tìm kiếm Packing List

- Ô tìm kiếm nằm ở đầu cột trái.
- Nhập **mã Packing List** hoặc **tên người nhận** để lọc danh sách.
- Danh sách cập nhật theo thời gian thực khi nhập.

### Xem lịch sử xuất của một Packing List

1. Nhấp vào một dòng Packing List trong danh sách bên trái.
2. Cột phải hiển thị toàn bộ các lượt xuất của PKL đó, bao gồm:

| Thông tin | Mô tả |
|---|---|
| Mã phiếu xuất | Mã định danh của từng lần xuất |
| Người thực hiện | Họ tên người tạo phiếu |
| Thời gian tạo | Ngày giờ tạo phiếu |
| Số thùng (carton) | Số lượng thùng đã xuất trong lần đó |
| Chi tiết thùng | Mã đơn hàng, SKU, số lượng cần / thực xuất, ghi chú |

### Trạng thái Packing List

| Trạng thái | Ý nghĩa |
|---|---|
| *(Chưa có lượt xuất)* | PKL chưa được xuất lần nào |
| Đã xuất một phần | Đã xuất nhưng chưa đủ toàn bộ số lượng yêu cầu |
| Đã xuất hoàn tất | Tổng số lượng thực xuất đã đủ hoặc bằng số lượng cần |

---

## 5. Tạo phiếu xuất kho mới

### Bước 1 — Mở cửa sổ tạo phiếu

- Nhấn nút **"Xuất kho mới"** (màu xanh lá, góc trên phải cột trái).
- Cửa sổ **"Xuất kho Packing List"** hiện ra.

> Nút bị vô hiệu hóa nếu tài khoản không có quyền `Edit`. Xem mục [10](#10-các-trường-và-hành-vi-bị-khóa-hoặc-giới-hạn-thao-tác).

---

### Bước 2 — Quét mã hoặc nhập mã Packing List

Trong cửa sổ xuất kho, có ô nhập ở đầu với nhãn **"Quét QR Code hoặc nhập mã Packing List"**.

**Cách nhập:**
- Dùng máy quét QR để quét trực tiếp → mã tự điền vào ô.
- Hoặc gõ tay mã PKL (ví dụ: `#PL-2025-0047`) rồi nhấn **Enter**.

**Sau khi quét thành công:**
- Thông tin Packing List hiện ra bên dưới: mã invoice, người nhận, số thùng, danh sách chi tiết đơn hàng trong từng thùng.
- Có thể **quét thêm nhiều Packing List khác** vào cùng một phiếu xuất bằng cách lặp lại thao tác quét.

---

### Bước 3 — Xem chi tiết và điều chỉnh số lượng thực xuất

Sau khi quét, mỗi Packing List hiển thị danh sách thùng hàng. Mỗi thùng chứa các dòng đơn hàng với các cột:

| Cột | Mô tả |
|---|---|
| Mã đơn hàng / SKU | Định danh sản phẩm trong thùng |
| Số lượng cần (Cần:) | Số lượng theo kế hoạch cần xuất |
| SL thực xuất | Số lượng thực tế nhân viên nhập vào — **có thể chỉnh sửa** |
| Ghi chú | Ghi chú tự do theo từng dòng đơn hàng — **tùy chọn** |

**Cách điều chỉnh:**
- Nhấp vào ô **"SL thực xuất"** và nhập số lượng mong muốn.
- Hệ thống tự tính lại tổng PCS xuất ở thanh tiêu đề (`X / Y PCS`).
- Nhập **Ghi chú** nếu cần (không bắt buộc).

---

### Bước 4 — Xác nhận xuất kho

1. Nhấn nút **"Xác nhận xuất kho (N PL)"** ở cuối cửa sổ.
2. Hộp thoại xác nhận hiện ra với tóm tắt:
   - Tổng số Packing List đang xuất.
   - Tổng số thành phẩm.
3. Nhấn **"Xác nhận"** để lưu, hoặc **"Hủy"** để quay lại chỉnh sửa.

---

## 6. Điều kiện quét hợp lệ và không hợp lệ

### ✅ Quét hợp lệ — Packing List được thêm vào danh sách khi

| Điều kiện | Chi tiết |
|---|---|
| Mã tồn tại trong hệ thống | QR code hoặc mã PKL được tìm thấy |
| Còn tồn kho để xuất | Ít nhất một dòng đơn hàng trong PKL còn số lượng tồn kho > 0 |
| Chưa quét trong phiếu hiện tại | PKL đó chưa có trong danh sách đang quét |
| Chưa hoàn tất xuất kho | Trạng thái PKL chưa phải "Đã xuất hoàn tất" |

### ❌ Quét không hợp lệ — Hệ thống báo lỗi và bỏ qua khi

| Trường hợp | Thông báo hiển thị |
|---|---|
| Ô nhập trống, nhấn Enter | *"Vui lòng không để trống"* |
| Mã không tồn tại hoặc không tìm thấy | *"Không tìm thấy Packing List"* |
| PKL không còn tồn kho (tất cả dòng = 0) | *"Không tìm thấy Packing List"* |
| PKL đã được quét trước đó trong cùng phiếu | *"Packing List đã được quét"* |
| PKL đã xuất kho hoàn tất trước đây | *"Packing List đã được xuất kho"* |

---

## 7. Quy tắc nhập số lượng và xác nhận lưu

### Quy tắc nhập SL thực xuất

| Quy tắc | Chi tiết |
|---|---|
| Phải lớn hơn 0 | Không được để 0 hoặc để trống |
| Không được vượt quá "Số lượng cần" | SL thực xuất ≤ SL cần xuất theo kế hoạch |
| Phân loại hàng phải khớp | Số lượng đơn hàng trong PKL phải bằng số lượng đã được nhập kho trước đó |

> **Giải thích quy tắc thứ 3:** Trước khi xuất kho, hàng phải được **phân loại thành phẩm** (classification). Nếu số lượng phân loại không khớp với số lượng nhập kho, hệ thống coi dữ liệu chưa hợp lệ và không cho lưu.

### Điều kiện để nút "Xác nhận xuất kho" cho phép lưu

Tất cả các điều kiện sau phải đồng thời thỏa mãn:

- [x] Đã quét ít nhất **1 Packing List**.
- [x] Tất cả dòng đơn hàng có **SL thực xuất > 0**.
- [x] Không có dòng nào có **SL thực xuất > SL cần**.
- [x] Không có thùng hàng hoặc đơn hàng bị **xóa một phần** (xóa thùng con nhưng còn thùng cha).
- [x] Số lượng phân loại của tất cả đơn hàng **khớp với số lượng nhập kho**.

---

## 8. Kết quả sau khi lưu

Sau khi nhấn **"Xác nhận"** trong hộp thoại xác nhận:

1. **Phiếu xuất kho được tạo** — hệ thống sinh mã phiếu xuất duy nhất.
2. **Tồn kho được trừ** — số lượng thực xuất bị trừ khỏi kho tự động (xử lý ngầm, không chặn giao diện).
3. **Lịch sử được ghi** — phiếu xuất xuất hiện trong cột phải khi chọn PKL tương ứng.
4. **Danh sách tự làm mới** — cột trái cập nhật lại danh sách, Packing List vừa xuất hiển thị đúng trạng thái mới.
5. **Cửa sổ tự đóng** — cửa sổ "Xuất kho Packing List" đóng lại.

### Trạng thái Packing List sau khi lưu

| Trường hợp | Trạng thái mới |
|---|---|
| Tổng SL thực xuất = SL cần (tất cả dòng) | **Đã xuất hoàn tất** |
| Tổng SL thực xuất < SL cần (có dòng còn thiếu) | **Đã xuất một phần** |

---

## 9. Các thông báo lỗi thường gặp

### Lỗi khi quét mã

| Thông báo | Nguyên nhân | Cách xử lý |
|---|---|---|
| *"Vui lòng không để trống"* | Nhấn Enter khi ô nhập đang trống | Nhập mã trước khi nhấn Enter |
| *"Không tìm thấy Packing List"* | Mã không tồn tại, hoặc PKL không còn tồn kho | Kiểm tra lại mã PKL, hoặc xác nhận hàng đã được nhập kho chưa |
| *"Packing List đã được quét"* | PKL đó đã có trong danh sách hiện tại | Không cần quét lại, kiểm tra danh sách bên dưới |
| *"Packing List đã được xuất kho"* | PKL đã được xuất hoàn tất trong quá khứ | PKL này không thể xuất thêm |

### Lỗi khi nhập số lượng

| Thông báo | Nguyên nhân | Cách xử lý |
|---|---|---|
| *"Vui lòng nhập số lượng lớn hơn 0"* | Ô SL thực xuất bằng 0 hoặc bỏ trống | Nhập số lượng ≥ 1 |
| *"Vui lòng không xuất vượt quá số lượng cần"* | SL thực xuất > SL cần theo kế hoạch | Giảm số lượng về ≤ SL cần |

### Lỗi khi xác nhận lưu

| Thông báo | Nguyên nhân | Cách xử lý |
|---|---|---|
| *"Chưa có packing list nào được quét"* | Nhấn xác nhận khi chưa quét PKL nào | Quét ít nhất một PKL trước |
| *"Số lượng đơn hàng trong Packing List không bằng với số lượng đơn hàng được nhập kho. Vui lòng phân loại lại Packing List!"* | PKL chưa được phân loại thành phẩm hoặc phân loại chưa đủ | Vào chức năng **Phân loại thành phẩm**, hoàn thành phân loại cho PKL đó rồi quay lại xuất kho |

---

## 10. Các trường và hành vi bị khóa hoặc giới hạn thao tác

### Nút bị vô hiệu hóa theo quyền

| Nút / Thao tác | Điều kiện bị khóa |
|---|---|
| Nút **"Xuất kho mới"** | Tài khoản không có quyền `Edit` |
| Toàn bộ cửa sổ tạo phiếu | Tài khoản không có quyền `Edit` |

### Giới hạn trong cửa sổ tạo phiếu xuất

| Hành vi | Giải thích |
|---|---|
| Không thể đóng cửa sổ bằng phím Esc | Hệ thống chặn để tránh mất dữ liệu đang nhập |
| Không thể đóng cửa sổ bằng cách nhấp ra ngoài | Tương tự — phải bấm nút **Đóng / Hủy** hoặc **Xác nhận** |
| Dòng đơn hàng có SL cần = 0 tự động ẩn | Những dòng không còn gì để xuất không hiện lên để tránh nhầm lẫn |
| Thùng hàng bị ẩn nếu toàn bộ dòng bên trong có SL = 0 | Thùng trống không hiện trong danh sách |
| Packing List đã xuất hoàn tất không quét lại được | Hệ thống từ chối với thông báo *"Packing List đã được xuất kho"* |

---

[![](https://book.app.tms-s.vn/uploads/images/gallery/2026-03/scaled-1680-/image-1774258477343-drawio.png)](https://book.app.tms-s.vn/uploads/images/gallery/2026-03/image-1774258477343-drawio.png)

# Hướng dẫn phân loại Packing List

# Hướng dẫn sử dụng — Chức năng Phân loại Thành phẩm

---

## Mục lục

1. [Mục đích](#1-mục-đích)
2. [URL truy cập](#2-url-truy-cập)
3. [Mục lục chức năng trên trang](#3-mục-lục-chức-năng-trên-trang)
4. [Truy cập chức năng](#4-truy-cập-chức-năng)
5. [Tìm kiếm và xem lịch sử phân loại](#5-tìm-kiếm-và-xem-lịch-sử-phân-loại)
6. [Tạo phiếu phân loại mới](#6-tạo-phiếu-phân-loại-mới)
7. [Điều kiện quét hợp lệ và không hợp lệ](#7-điều-kiện-quét-hợp-lệ-và-không-hợp-lệ)
8. [Quy tắc nhập số lượng và xác nhận lưu](#8-quy-tắc-nhập-số-lượng-và-xác-nhận-lưu)
9. [Kết quả sau khi lưu](#9-kết-quả-sau-khi-lưu)
10. [Các thông báo lỗi thường gặp](#10-các-thông-báo-lỗi-thường-gặp)
11. [Các trường và hành vi bị khóa hoặc giới hạn thao tác](#11-các-trường-và-hành-vi-bị-khóa-hoặc-giới-hạn-thao-tác)

---

## 1. Mục đích

Chức năng **Phân loại thành phẩm** dùng để ghi nhận việc phân bổ số lượng hàng hóa từ kho vào từng Packing List theo đơn hàng thực tế. Có **3 loại phân loại**:

| Loại | Ý nghĩa | Tồn kho thay đổi |
|---|---|---|
| **Nhập kho** | Hàng từ PKL chuyển vào kho chung (phân loại để giảm bớt dư thừa) | ↓ Giảm |
| **Nhập PKL** | Hàng từ kho phân bổ vào PKL (bổ sung đủ số lượng còn thiếu) | ↑ Tăng |
| **Nhập PKL Customer** | Chuyển hàng từ một PKL gốc sang PKL khách hàng | Cập nhật chéo |

> **Lưu ý quan trọng:** Phân loại phải hoàn thành **trước khi xuất kho**. Nếu bỏ qua bước này, chức năng Xuất kho sẽ báo lỗi *"Phân loại chưa khớp"* và không cho lưu phiếu xuất.

---

## 2. URL truy cập

| Ngôn ngữ | Đường dẫn |
|---|---|
| Tiếng Việt | `/vi/finished-product-classification` |
| Tiếng Anh | `/en/finished-product-classification` |

---

## 3. Mục lục chức năng trên trang

Trang được chia làm hai cột:

- **Cột trái:** Lịch sử các phiếu phân loại đã tạo — tìm kiếm, lọc, chọn để xem chi tiết.
- **Cột phải:** Chi tiết từng phiếu được chọn — hiển thị danh sách đơn hàng, số lượng phân loại, số lượng tồn.

Phía trên cột trái có **3 nút tạo phiếu mới**:

| Nút | Loại phân loại |
|---|---|
| Nhập kho | Phân loại nhập kho (giảm tồn) |
| Nhập PKL | Phân loại nhập PKL (tăng tồn) |
| Nhập PKL Customer | Phân loại chuyển sang PKL khách hàng |

---

## 4. Truy cập chức năng

### Yêu cầu quyền

| Quyền | Cho phép làm gì |
|---|---|
| `View` | Vào trang, xem lịch sử, xem chi tiết |
| `Edit` | Tạo phiếu phân loại mới (3 nút phân loại mới được kích hoạt) |

Nếu không có quyền `View`, hệ thống hiển thị trang **"Từ chối truy cập"**.  
Nếu chỉ có quyền `View` (không có `Edit`), các nút **Nhập kho / Nhập PKL / Nhập PKL Customer** bị vô hiệu hóa.

### Yêu cầu tài khoản

Tài khoản đăng nhập **phải được gán Chi nhánh**. Nếu chưa được gán, khi cố quét mã hệ thống sẽ báo lỗi:  
*"Tài khoản chưa được gán Chi nhánh. Vui lòng liên hệ Admin."*

---

## 5. Tìm kiếm và xem lịch sử phân loại

### Tìm kiếm theo mã

- Nhập mã phiếu hoặc mã Packing List vào ô tìm kiếm ở đầu cột trái.

### Lọc nâng cao

Nhấn biểu tượng **Bộ lọc** (góc trên cột trái) để mở bảng lọc:

| Trường lọc | Mô tả |
|---|---|
| Loại phân loại | Tất cả / Nhập PKL / Nhập kho |
| Từ ngày | Ngày tạo phiếu (định dạng `dd-mm-yyyy`) |
| Đến ngày | Ngày tạo phiếu (định dạng `dd-mm-yyyy`) |
| Người tạo | Tên người tạo phiếu |

Nhấn **"Áp dụng"** để lọc, **"Xóa lọc"** để đặt lại.

> Khi có bộ lọc đang hoạt động, biểu tượng Bộ lọc hiển thị dấu chấm màu để nhắc nhở.

### Xem chi tiết phiếu

1. Nhấp vào một phiếu trong danh sách bên trái.
2. Cột phải hiển thị chi tiết phiếu đó:

| Thông tin | Mô tả |
|---|---|
| Mã phiếu | Mã định danh phiếu phân loại |
| Loại | Badge hiển thị: **Nhập kho** / **Nhập PKL** / **Nhập PKL Customer** |
| Người tạo | Họ tên người thực hiện |
| Thời gian tạo | Ngày giờ tạo phiếu |
| Mã đơn hàng / SKU | Tên và mã định danh sản phẩm |
| SL phân loại | Số lượng đã phân loại trong lần này |
| SL tồn | Số lượng tồn kho sau phân loại |
| SL cần | Số lượng cần phân loại theo kế hoạch |

Nhấn **"Chi tiết"** trên từng dòng đơn hàng để xem danh sách chi tiết theo từng thùng và Packing List.

---

## 6. Tạo phiếu phân loại mới

### 6.1. Phân loại Nhập kho (`Nhập kho`)

Dùng khi hàng đã được **nhập vào kho nhiều hơn đơn hàng yêu cầu**, cần phân loại để điều chỉnh về đúng số lượng.

**Bước 1 — Mở cửa sổ phân loại**

Nhấn nút **"Nhập kho"** → cửa sổ **"Phân loại nhập kho"** (viền xanh lá) mở ra.

**Bước 2 — Quét mã Packing List**

- Ô nhập ở trên cùng: *"Quét mã PKL"*.
- Dùng máy quét QR hoặc nhập tay mã PKL → nhấn **Enter**.
- Thông tin PKL và danh sách thùng hàng / đơn hàng hiện ra bên dưới.
- Có thể quét thêm nhiều PKL khác vào cùng một phiếu.

**Bước 3 — Nhập số lượng phân loại**

Mỗi dòng đơn hàng hiển thị:

| Cột | Ý nghĩa |
|---|---|
| Mã / Tên đơn hàng | Định danh sản phẩm |
| SL cần | Số lượng hệ thống tính cần phân loại (`nhập kho − đơn hàng`) |
| SL thực phân loại | **Nhập tay** — số lượng thực tế phân loại |

> **Cột trái:** Nhấp vào một PKL trong danh sách để xem chi tiết thùng hàng của PKL đó ở cột phải.

**Bước 4 — Xác nhận**

- Kiểm tra tổng `X / Y PCS` ở thanh tiêu đề cửa sổ.
- Nhấn **"Xác nhận"** → hộp thoại xác nhận hiện ra → nhấn **"Xác nhận"** lần nữa để lưu.

---

### 6.2. Phân loại Nhập PKL (`Nhập PKL`)

Dùng khi **đơn hàng còn thiếu số lượng nhập kho**, cần phân bổ thêm hàng từ kho vào PKL.

**Bước 1 — Mở cửa sổ phân loại**

Nhấn nút **"Nhập PKL"** → cửa sổ **"Phân loại nhập PKL"** (viền xanh dương) mở ra.

**Bước 2 — Quét mã Packing List**

Thao tác tương tự mục 6.1. Hệ thống tự động tính:

- **SL cần** = `đơn hàng − nhập kho` (số lượng còn thiếu).
- **SL gợi ý** = số lượng tồn kho còn có thể phân bổ cho đơn hàng này (đã trừ các PKL khác đang quét).

**Bước 3 — Nhập / điều chỉnh số lượng**

- Hệ thống tự điền SL gợi ý vào ô. Có thể sửa lại nếu cần.
- Validation nếu cùng một đơn hàng xuất hiện trên nhiều PKL, hệ thống kiểm tra tổng cộng không vượt quá tồn kho.

**Bước 4 — Xác nhận** — tương tự mục 6.1.

---

### 6.3. Phân loại Nhập PKL cho khách hàng (`Nhập PKL Customer`)

Dùng để chuyển hàng từ **PKL nguồn (inbound)** sang **PKL cho khách hàng (customer)**.

**Bước 1 — Mở cửa sổ**

Nhấn nút **"Nhập PKL Customer"** → cửa sổ có **2 ô quét riêng biệt**.

**Bước 2 — Quét PKL nguồn (bên trái)**

- Ô **"Quét mã PKL"**: quét QR hoặc nhập mã PKL gốc (PKL chứa hàng trong kho).
- PKL được thêm vào danh sách bên trái.

**Bước 3 — Quét PKL khách hàng (bên phải)**

- Ô **"Quét mã Packing List Customer"**: quét QR hoặc nhập mã PKL khách hàng.
- Chỉ chấp nhận **PKL loại Customer** — nếu quét PKL thường sẽ báo lỗi: *"Vui lòng quét Packing List Customer."*

**Bước 4 — Nhập số lượng và xác nhận** — tương tự các bước trên.

---

## 7. Điều kiện quét hợp lệ và không hợp lệ

### ✅ Quét hợp lệ — PKL được thêm vào khi

| Điều kiện | Chi tiết |
|---|---|
| Mã tồn tại | QR code / mã PKL được tìm thấy trong hệ thống |
| Chưa xuất kho | Trạng thái PKL không phải `completed_outbound` hoặc `partial_outbound` |
| Chưa có trong danh sách | PKL chưa được quét trong phiếu đang làm |
| Tài khoản có chi nhánh | Người dùng đã được gán chi nhánh |

### ❌ Quét không hợp lệ — Hệ thống báo lỗi khi

| Trường hợp | Thông báo |
|---|---|
| Ô nhập trống | *"Vui lòng không để trống"* |
| Mã không tồn tại | *"Không tìm thấy Packing List"* |
| PKL đã được xuất kho | *"Packing List đã xuất kho"* |
| PKL đã có trong danh sách | *"Packing List đã tồn tại trong danh sách"* |
| PKL không khả dụng (mọi thùng đều trống) | *"Packing List không khả dụng"* |
| Quét PKL thường vào ô PKL Customer | *"Vui lòng quét Packing List Customer."* |
| Tài khoản chưa có chi nhánh | *"Tài khoản chưa được gán Chi nhánh. Vui lòng liên hệ Admin."* |

---

## 8. Quy tắc nhập số lượng và xác nhận lưu

### Quy tắc chung cho mọi loại phân loại

| Quy tắc | Chi tiết |
|---|---|
| Phải lớn hơn 0 | Không được để trống hoặc nhập 0 |
| Chỉ nhập số nguyên dương | Không nhập số thập phân, chữ cái, ký tự đặc biệt |
| Tối đa 12 chữ số | Hệ thống tự chặn khi vượt giới hạn |

### Quy tắc riêng theo loại

**Nhập kho (giảm tồn):**
- SL thực phân loại ≤ SL nhập kho của đơn hàng đó.
- Lỗi nếu vượt: *"Không nhập vượt quá số lượng đang có của đơn hàng (X)"*

**Nhập PKL (tăng tồn):**
- Tổng SL phân loại của cùng một đơn hàng trên nhiều PKL ≤ tổng tồn kho khả dụng.
- Lỗi nếu vượt: *"Không nhập vượt quá số tồn (X)"*
- Validation chạy theo thời gian thực khi nhập — thông báo lỗi hiện ngay dưới ô nhập.

### Điều kiện để lưu phiếu thành công

Tất cả điều kiện sau phải đồng thời thỏa mãn:

- [x] Đã quét ít nhất **1 Packing List**.
- [x] Tất cả dòng đơn hàng (không bị xóa, không trống) có **SL > 0**.
- [x] Không có dòng nào còn **cảnh báo lỗi** (ô noti không rỗng).
- [x] Tài khoản có **chi nhánh hợp lệ**.
- [x] Phiên đăng nhập **còn hiệu lực**.

---

## 9. Kết quả sau khi lưu

Sau khi xác nhận thành công:

1. **Phiếu phân loại được tạo** — mã phiếu duy nhất được sinh tự động.
2. **Tồn kho cập nhật:**
   - **Nhập kho:** tồn kho **giảm** theo SL phân loại.
   - **Nhập PKL:** tồn kho **tăng** theo SL phân loại.
3. **Lịch sử cập nhật** — phiếu mới xuất hiện đầu danh sách bên trái với badge loại tương ứng.
4. **Cửa sổ tự đóng** — màn hình chính tự làm mới.

### Trạng thái Packing List sau phân loại

| Trường hợp | Trạng thái |
|---|---|
| Tổng SL thực phân loại = SL cần (tất cả dòng) | **Phân loại hoàn tất** (`completed_classification`) |
| Tổng SL thực phân loại < SL cần (có dòng còn thiếu) | **Phân loại một phần** (`partial_classification`) |

> PKL ở trạng thái **phân loại một phần** vẫn có thể xuất kho nhưng hệ thống sẽ báo không khớp nếu tổng số lượng đơn hàng chưa đủ.

---

## 10. Các thông báo lỗi thường gặp

### Lỗi khi quét mã

| Thông báo | Nguyên nhân | Cách xử lý |
|---|---|---|
| *"Vui lòng không để trống"* | Nhấn Enter khi ô trống | Nhập mã trước khi Enter |
| *"Không tìm thấy Packing List"* | Mã không tồn tại | Kiểm tra lại mã PKL |
| *"Packing List đã xuất kho"* | PKL đã được xuất hoàn tất | PKL này không phân loại được nữa |
| *"Packing List đã tồn tại trong danh sách"* | Quét trùng | Không cần quét lại |
| *"Packing List không khả dụng"* | PKL không còn dữ liệu hợp lệ | Kiểm tra lại trạng thái PKL |
| *"Tài khoản chưa được gán Chi nhánh..."* | Tài khoản thiếu cấu hình | Liên hệ Admin để gán chi nhánh |

### Lỗi khi nhập số lượng

| Thông báo | Nguyên nhân | Cách xử lý |
|---|---|---|
| *"Vui lòng nhập số lượng lớn hơn 0"* | Ô để trống hoặc nhập 0 | Nhập số ≥ 1 |
| *"Không nhập vượt quá số lượng đang có của đơn hàng (X)"* | SL > SL nhập kho (mode Nhập kho) | Giảm SL về ≤ X |
| *"Không nhập vượt quá số tồn (X)"* | Tổng SL vượt tồn kho (mode Nhập PKL) | Giảm SL về ≤ X |

### Lỗi khi xác nhận lưu

| Thông báo | Nguyên nhân | Cách xử lý |
|---|---|---|
| *"Vui lòng kiểm tra lại số lượng phân loại"* | Còn dòng có SL = 0 hoặc có lỗi validation | Kiểm tra và sửa các ô đang báo lỗi |
| *"Không có dữ liệu hợp lệ để lưu"* | Tất cả thùng/đơn hàng đã bị xóa hoặc trống | Quét lại PKL và nhập số lượng |
| *"Phiên đăng nhập không hợp lệ..."* | Session hết hạn | Tải lại trang và đăng nhập lại |
| *"Không thể tạo phiếu phân loại"* | Lỗi từ phía hệ thống | Thử lại, hoặc liên hệ bộ phận kỹ thuật |

---

## 11. Các trường và hành vi bị khóa hoặc giới hạn thao tác

### Nút bị vô hiệu hóa theo quyền

| Nút / Thao tác | Điều kiện bị khóa |
|---|---|
| Nút **Nhập kho** | Tài khoản không có quyền `Edit` |
| Nút **Nhập PKL** | Tài khoản không có quyền `Edit` |
| Nút **Nhập PKL Customer** | Tài khoản không có quyền `Edit` |

### Hành vi bị giới hạn trong cửa sổ phân loại

| Hành vi | Giải thích |
|---|---|
| Không thể đóng bằng phím **Esc** | Hệ thống chặn để tránh mất dữ liệu đang nhập |
| Không thể đóng bằng cách nhấp ra ngoài | Tương tự — phải bấm **Hủy** hoặc **Xác nhận** |
| Dòng đơn hàng có SL nhập kho = 0 tự động bị ẩn / đánh dấu xóa | Không hiển thị những dòng không liên quan |
| Thùng hàng tự động bị xóa khi tất cả đơn hàng bên trong bị xóa | Dọn dẹp giao diện tự động |
| PKL tự động bị xóa khỏi danh sách khi tất cả thùng bị xóa | Tương tự |
| Ô SL thực phân loại chỉ nhận số nguyên | Không nhập được số thập phân hoặc chữ |
| Giới hạn 12 chữ số cho ô số lượng | Hệ thống tự chặn khi nhập quá |
| Validation lỗi hiển thị khi nhập | Không cần nhấn Xác nhận mới thấy lỗi |

### Lưu ý về xóa thùng hàng / đơn hàng

Trong cửa sổ phân loại, có nút **xóa** (thùng rác) ở cạnh mỗi thùng hàng và đơn hàng:

- Xóa thùng hàng → tất cả đơn hàng trong thùng đó bị bỏ qua khi lưu.
- Xóa đơn hàng → đơn hàng đó bị bỏ qua khi lưu.
- Khi tất cả thùng của một PKL bị xóa → PKL đó tự động biến mất khỏi danh sách.
- **Thao tác này không thể hoàn tác** trong phiếu hiện tại — nếu xóa nhầm, cần đóng cửa sổ và tạo lại.

---

# Hướng dẫn tồn kho đơn hàng (LOGISTIC)

## 1) Mục đích

Tài liệu này hướng dẫn người dùng thao tác **Đơn hàng tồn kho** trên WMS, gồm:

- Tìm kiếm danh sách đơn hàng có tồn kho (logistic transfer)
- Xem nhanh **Tồn kho** và **Tổng số lượng (Order)** trên từng thẻ đơn
- Chọn đơn để xem **tổng quan số liệu** và **lịch sử xuất nhập / phân loại** theo từng tab
- Hiểu phân trang và các thông báo lỗi thường gặp

## 2) URL truy cập

- Menu: **Kho** → mục tương ứng chức năng tồn kho đơn hàng (theo quyền được gán trên hệ thống)
- <a target="__blank" href="https://logistic-client.datacenter.tms-s.vn/vi/warehouse-inventory">https://logistic-client.datacenter.tms-s.vn/vi/warehouse-inventory</a>

## 3) Mục lục

- Truy cập chức năng
- Tìm kiếm và danh sách đơn hàng tồn kho
- Xem chi tiết đơn hàng (thống kê + bảng lịch sử)
- Tab Thông tin tồn kho
- Tab Lịch sử nhập kho
- Tab Lịch sử xuất kho
- Tab Lịch sử phân loại
- Phân trang
- Các thông báo lỗi thường gặp
- Quyền truy cập và giới hạn
- Sơ đồ luồng (Diagram)

## 4) Truy cập chức năng

1. Đăng nhập WMS với tài khoản được cấp quyền xem màn tồn kho.
2. Mở nhóm menu **Kho**, chọn mục **Đơn hàng tồn kho** (hoặc tên hiển thị theo quyền trên menu).
3. Màn hình chia **2 cột**:
   ###### **Trái:** danh sách đơn hàng + ô tìm kiếm
   ###### **Phải:** chi tiết đơn đang chọn (thống kê + các tab lịch sử)

## 5) Tìm kiếm và danh sách đơn hàng tồn kho

### 5.1 Tìm kiếm

- Nhập từ khóa vào ô tìm kiếm, nhấn **Enter** để gửi tìm kiếm.
- Gợi ý: tìm theo:
-   **Mã đơn**
- **Sản phẩm**
-  **Sku** 


### 5.2 Danh sách đơn hàng (Left Panel)

Mỗi thẻ hiển thị:

- **Mã đơn hàng**
- Trạng thái **Còn hàng** (badge)
- **Tồn kho:** số lượng hàng đang có trong kho
- **Tổng số lượng:** số lượng khi tạo đơn hàng

Hệ thống có thể **tự chọn đơn đầu tiên** trong danh sách khi tải xong; khi đổi trang/tìm kiếm, nếu đơn đang chọn không còn trong danh sách thì sẽ chọn lại đơn hợp lệ đầu tiên.

## 6) Xem chi tiết đơn hàng

Khi chọn một đơn ở cột trái, cột phải hiển thị:

### 6.1 Thông tin định danh

- **Mã đơn** và **tên đơn / mô tả**

### 6.2 Bốn ô thống kê

| Ô | Ý nghĩa (theo giao diện) |
|---|-------------------------|
| **Tổng số lượng** | Tổng số lượng đơn hàng (Order) |
| **Tồn kho** | Số lượng còn trong kho |
| **Chưa phân loại** | Số lượng chưa phân loại (theo dữ liệu hệ thống) |
| **Đã xuất** | Tổng số lượng xuất (đồng bộ từ tổng hợp lịch sử khi tải dữ liệu chi tiết) |

### 6.3 Khối “Lịch sử xuất nhập kho”

Phía dưới là vùng bảng với **4 tab**; mỗi lần **đổi tab**, hệ thống **tải dữ liệu** tương ứng (trang 1).  
Phạm vi dữ liệu theo ngữ cảnh **kho logistic transfer**

## 7) Tab **Thông tin tồn kho**

Hiển thị phân bổ tồn theo dòng (nếu có dữ liệu), các cột gồm:

- **Phân loại:** Đã phân loại / Chưa phân loại
- **Packing List / Invoice**
- **Thùng**
- **Số lượng**
- **Ngày nhập** (cập nhật)
- **Kho**

Nếu không có dữ liệu: hiển thị **Không có dữ liệu tồn kho**.

## 8) Tab **Lịch sử nhập kho**

Các cột gồm:

- **Loại:** Theo PL / Trực tiếp
- **Mã nhập kho**
- **PL / Invoice / Kiện**
- **Thùng**
- **Số lượng** (hiển thị dạng **+** số lượng nhập)
- **Ngày tạo**
- **Người tạo**

Không có dữ liệu: **Không có lịch sử nhập kho**.

## 9) Tab **Lịch sử xuất kho**

Các cột gồm:

- **Loại:** Theo PL / Trực tiếp
- **Mã xuất kho**
- **PL / Invoice / Kiện**
- **Thùng**
- **Số lượng** (hiển thị dạng **-** số lượng xuất)
- **Ngày xuất**
- **Người tạo**

Không có dữ liệu: **Không có lịch sử xuất kho**.

## 10) Tab **Lịch sử phân loại**

Các cột gồm:

- **Mã phân loại**
- **Packing List**
- **Thùng**
- **Số lượng** (có dấu **+** hoặc **-** tùy loại điều chỉnh)
- **Loại:** Nhập / Xuất (theo badge)
- **Ngày tạo**
- **Người tạo**

Không có dữ liệu: **Không có lịch sử phân loại**.

## 11) Phân trang

- **Danh sách đơn bên trái:** phân trang theo cấu hình API (kích thước trang do hệ thống trả về).
- **Bảng trong từng tab:** mặc định **20 dòng/trang**; nếu có nhiều hơn một trang, thanh phân trang hiển thị **dưới bảng** của tab đang mở.

## 12) Các thông báo lỗi thường gặp

- `Không thể tải danh sách đơn hàng tồn kho` — lỗi khi gọi API danh sách đơn.
- `Không thể tải dữ liệu chi tiết` — lỗi khi tải dữ liệu một trong các tab lịch sử.

## 13) Quyền truy cập và giới hạn

- Màn hình được bọc **kiểm tra quyền**; không đủ quyền sẽ không vào được trang (theo cấu hình WMS).
- Chức năng này **xem và tra cứu** lịch sử; không mô tả thao tác chỉnh sửa tồn kho trực tiếp trên màn này (nhập/xuất/phân loại thực hiện ở các màn chuyên biệt khác).

## 14) Sơ đồ luồng (Mermaid)

### 14.1 Flow tổng quan – tra cứu tồn kho đơn hàng
<a href="https://drive.google.com/file/d/1nTFBmTbjoprVm1lSH0-8ONbxiF0-pWhK/view?usp=sharing">
 Warehouse-Inventory Diagram
</a>

[![Screenshot from 2026-03-23 23-05-14.png](https://book.app.tms-s.vn/uploads/images/gallery/2026-03/scaled-1680-/screenshot-from-2026-03-23-23-05-14.png)](https://book.app.tms-s.vn/uploads/images/gallery/2026-03/screenshot-from-2026-03-23-23-05-14.png)