# Stock Transfer — Chuyển kho / đổi vị trí

> Fine Chemical (FC) · Module WMS · v1.5 · 18/09/2026 · Flow chuẩn — dùng để triển khai, kiểm thử và phát triển
>
> File sinh tự động từ sơ đồ bởi `sync.js` — đừng sửa tay. Hình là chuẩn: thấy mâu thuẫn với trang hình thì báo lại.
>
> Trang hình: /wms/stock-transfer

## Cách đọc

- Mỗi hộp trên sơ đồ có một mã `Bxx`, đánh theo thứ tự đi của luồng (từ điểm bắt đầu, theo mũi tên).
- "Đi tới" liệt kê mọi mũi tên ra khỏi hộp; chữ trong ngoặc vuông là nhãn điều kiện của mũi tên đó.
- "Nhánh tuỳ chọn" = mũi tên nét đứt trên sơ đồ: làm cũng được, bỏ qua cũng được.
- Hộp loại "Dữ liệu" ở lane Input là dữ liệu đi vào, ở lane Output là kết quả / điểm kết thúc của luồng.

## Process Flow (swimlane)

### Vai trò (lane)

- Input
- Warehouse Staff
- Warehouse Manager
- Output

### Các bước

| Mã | Vai trò | Loại | Nội dung | Nền tảng · Màn hình | Đi tới |
| --- | --- | --- | --- | --- | --- |
| B01 | Input | Dữ liệu | Item / Warehouse Master Location (Bin) | Master data | B03 |
| B02 | Input | Dữ liệu | Tồn kho tại kho / vị trí nguồn | Tồn kho | B14 |
| B03 | Warehouse Staff | Bắt đầu | Start |  | B04 |
| B04 | Warehouse Staff | Điểm quyết định | Request hay Slip độc lập? |  | B05 [Slip độc lập]; B06 [Tạo Request] |
| B05 | Warehouse Staff | Bước | Create Transfer Slip (standalone) Item/Stock · map barcode | Web · Stock Transfer | B07 |
| B06 | Warehouse Staff | Bước | Create Transfer Request | Web · Stock Transfer | B08 |
| B07 | Warehouse Staff | Bước | Submit for Approval | Web · Stock Transfer | B09 [Slip SUBMITTED] |
| B08 | Warehouse Staff | Điểm quyết định | Loại chuyển kho? |  | B10 [WH → WH]; B11 [Bin → Bin] |
| B09 | Warehouse Manager | Điểm quyết định | Kỳ kho của phiếu đã chốt? |  | B12 [Đã chốt]; B13 [Chưa] |
| B10 | Warehouse Staff | Bước | WH → WH: From WH → To WH | Web · Stock Transfer | B14 |
| B11 | Warehouse Staff | Bước | Bin → Bin: From → To Location (cùng kho) | Web · Stock Transfer | B14 |
| B12 | Output | Dữ liệu | Chặn mọi action: Submit · Approve · Cancel · Delete — This action cannot be completed because the affected inventory period is closed through [Close Date] |  | (kết thúc) |
| B13 | Warehouse Manager | Bước | Approve Slip | Web · Stock Transfer | B15 |
| B14 | Warehouse Staff | Bước | Thêm dòng hàng (Item / Stock) | Web · Stock Transfer | B16 |
| B15 | Warehouse Manager | Điểm quyết định | Available Stock nguồn ≥ Qty? |  | B17 [Không]; B18 [Có] |
| B16 | Warehouse Staff | Bước | Submit Request | Web · Stock Transfer | B19 [SUBMITTED] |
| B17 | Output | Dữ liệu | Chặn Approve — Slip giữ SUBMITTED |  | (kết thúc) |
| B18 | Warehouse Manager | Bước | Trừ Stock nguồn Cộng Stock đích | System (auto) · Stock Transfer | B20; B21 [nhánh tuỳ chọn]; B22 |
| B19 | Warehouse Staff | Bước | Print QR (QR = Request No.) | Web · Stock Transfer | B23 |
| B20 | Output | Dữ liệu | Transfer Slip = APPROVED Tồn kho chuyển nguồn → đích |  | (kết thúc) |
| B21 | Warehouse Staff | Bước | W/H Stock Checking (view-only, tra cứu) | Web · W/H Stock Checking |  |
| B22 | Warehouse Manager | Điểm quyết định | Request còn Remaining > 0? |  | B24 [Không]; B23 [Có — tạo Slip mới cho phần còn lại] |
| B23 | Warehouse Staff | Điểm quyết định | Tạo Slip ở đâu? |  | B25 [Mobile]; B26 [Web] |
| B24 | Output | Dữ liệu | Request → CLOSED (tự động) |  | (kết thúc) |
| B25 | Warehouse Staff | Bước | Scan QR Request → tự sinh Slip | Mobile · Stock Transfer | B27 |
| B26 | Warehouse Staff | Bước | Create Transfer Slip from this Request | Web · Stock Transfer | B28 |
| B27 | Warehouse Staff | Bước | Scan Barcode | Mobile · Stock Transfer | B29 |
| B28 | Warehouse Staff | Bước | From Request → lấy dòng hàng | Web · Stock Transfer | B30 |
| B29 | Warehouse Staff | Bước | Make Slip | Mobile · Stock Transfer | B07 |
| B30 | Warehouse Staff | Bước | Map Barcode (double-click ô Barcode) | Web · Stock Transfer | B07 |
| B31 | Warehouse Manager | Bắt đầu | Start |  | B32 |
| B32 | Warehouse Manager | Bước | Cancel (Slip đang APPROVED) | Web · Stock Transfer | B33 |
| B33 | Warehouse Manager | Điểm quyết định | Đủ tồn đích VÀ chưa có action tiếp theo? |  | B34 [Không]; B35 [Có] |
| B34 | Output | Dữ liệu | Chặn huỷ — hàng đã dùng ở đích hoặc đã có action ở màn khác |  | (kết thúc) |
| B35 | Warehouse Manager | Bước | Slip → CANCELLED trả Stock đích → nguồn | System (auto) · Stock Transfer | B36; B37 |
| B36 | Output | Dữ liệu | Tồn kho về lại nguồn Slip = CANCELLED |  | (kết thúc) |
| B37 | Output | Dữ liệu | Request đang CLOSED → quay lại SUBMITTED |  | (kết thúc) |

### Chi tiết từng bước (nội dung hover trên sơ đồ)

#### B04 · Request hay Slip độc lập?

- Warehouse Staff
- Đến từ: B03
- Đi tới [Slip độc lập]: B05 · Create Transfer Slip (standalone) Item/Stock · map barcode
- Đi tới [Tạo Request]: B06 · Create Transfer Request

#### B08 · Loại chuyển kho?

- Warehouse Staff
- Đến từ: B06
- Đi tới [WH → WH]: B10 · WH → WH: From WH → To WH
- Đi tới [Bin → Bin]: B11 · Bin → Bin: From → To Location (cùng kho)

#### B09 · Kỳ kho của phiếu đã chốt?

- Warehouse Manager
- Đến từ: B07
- Đi tới [Đã chốt]: B12 · Chặn mọi action: Submit · Approve · Cancel · Delete — This action cannot be completed because the affected inventory period is closed through [Close Date]
- Đi tới [Chưa]: B13 · Approve Slip

#### B15 · Available Stock nguồn ≥ Qty?

- Warehouse Manager
- Đến từ: B13
- Đi tới [Không]: B17 · Chặn Approve — Slip giữ SUBMITTED
- Đi tới [Có]: B18 · Trừ Stock nguồn Cộng Stock đích

#### B22 · Request còn Remaining > 0?

- Warehouse Manager
- Đến từ: B18
- Đi tới [Không]: B24 · Request → CLOSED (tự động)
- Đi tới [Có — tạo Slip mới cho phần còn lại]: B23 · Tạo Slip ở đâu?

#### B23 · Tạo Slip ở đâu?

- Warehouse Staff
- Đến từ: B19, B22
- Đi tới [Mobile]: B25 · Scan QR Request → tự sinh Slip
- Đi tới [Web]: B26 · Create Transfer Slip from this Request

#### B33 · Đủ tồn đích VÀ chưa có action tiếp theo?

- Warehouse Manager
- Đến từ: B32
- Đi tới [Không]: B34 · Chặn huỷ — hàng đã dùng ở đích hoặc đã có action ở màn khác
- Đi tới [Có]: B35 · Slip → CANCELLED trả Stock đích → nguồn

## Vòng đời trạng thái

#### Transfer Request

`SAVED` → `SUBMITTED` → `CLOSED`

Bước chuyển:

- `SAVED` -- Submit Request --> `SUBMITTED`
- `SUBMITTED` -- Auto: mọi dòng Remaining = 0 --> `CLOSED`
- `CLOSED` -- Slip liên kết bị Cancel — Remaining tăng lại --> `SUBMITTED` (quay lại)
- `SAVED` -- Delete Request --> `Đã xoá`

#### Transfer Slip

`SAVED` → `SUBMITTED` → `APPROVED` → `CANCELLED`

Bước chuyển:

- `SAVED` -- Submit for Approval --> `SUBMITTED`
- `SUBMITTED` -- Approve — đủ tồn nguồn --> `APPROVED`
- `APPROVED` -- Cancel — đủ tồn đích & chưa có action sau --> `CANCELLED`
- `CANCELLED` -- Sửa Remark / Line item → Approve lại --> `APPROVED` (quay lại)
- `SAVED` -- Delete --> `Đã xoá`

- `CANCELLED` (Transfer Slip) → kéo hàng Transfer Request quay lại

Ghi chú trên sơ đồ:

- Chặn Approve nếu Available Stock nguồn < Qty — Slip giữ SUBMITTED, hoặc kỳ kho đã chốt

## Input

| # | Input | Loại | Đi vào bước |
| --- | --- | --- | --- |
| I-1 | Item Master, Warehouse, Location (Bin) | Master data | Mọi dòng hàng, header Request/Slip |
| I-2 | Tồn kho tại kho / vị trí nguồn | Tồn kho | Thêm dòng hàng (Stock popup) · Approve Slip (kiểm Available Stock nguồn) |

## Bước ↔ màn hình thực hiện

| Bước | Vai trò | Màn hình |
| --- | --- | --- |
| Create Transfer Request · chọn loại WH → WH / Bin → Bin · Thêm dòng hàng (Item / Stock) | Warehouse Staff | Stock Transfer · Web |
| Submit Request · Print QR | Warehouse Staff | Stock Transfer · Web |
| Scan QR Request → tự sinh Slip · Scan Barcode · Make Slip | Warehouse Staff | Stock Transfer · Mobile |
| Create Transfer Slip from this Request · From Request · Map Barcode | Warehouse Staff | Stock Transfer · Web |
| Create Transfer Slip (standalone) | Warehouse Staff | Stock Transfer · Web |
| Submit for Approval | Warehouse Staff | Stock Transfer · Web |
| W/H Stock Checking (tra cứu, tuỳ chọn) | Warehouse Staff | W/H Stock Checking · Web |
| Approve Slip · Cancel | Warehouse Manager | Stock Transfer · Web |
| Kỳ kho của phiếu đã chốt → chặn mọi action (Submit · Approve · Cancel · Delete) với thông báo `This action cannot be completed because the affected inventory period is closed through [Close Date]` | System (auto) | Stock Transfer |

## Output

| # | Output | Điều kiện sinh ra |
| --- | --- | --- |
| O-1 | Transfer Request: `SAVED` → `SUBMITTED` → `CLOSED` | CLOSED tự động khi mọi dòng Remaining = 0 |
| O-2 | Transfer Slip = `APPROVED` | Manager bấm Approve Slip khi Slip đang `SUBMITTED` và Available Stock nguồn ≥ Qty |
| O-3 | Tồn kho giảm tại kho / vị trí nguồn, tăng tại kho / vị trí đích | Ngay khi Approve |
| O-4 | Transferred / Remaining trên dòng Request cập nhật | Slip có liên kết Request |
| O-5 | *Chặn Approve:* Slip giữ `SUBMITTED`, tồn kho không đổi | Available Stock nguồn < Qty |
| O-6 | *Ngoại lệ:* Slip = `CANCELLED`, tồn kho trả từ đích về nguồn, Request đang CLOSED quay về SUBMITTED — hoặc bị chặn huỷ | Slip đang `APPROVED`; chặn nếu Available Stock đích < Qty, hoặc đã có action ở màn khác |
