# Product Income — Nhập kho thành phẩm

> Fine Chemical (FC) · Module WMS · v1.4 · 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/product-income

## 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 Master (Variant) Warehouse · Location (Bin) User gán kho | Master data | B04 |
| B02 | Input | Dữ liệu | Sales Order = APPROVED | Sales Order | B06 |
| B03 | Input | Dữ liệu | Thành phẩm hoàn thành giao từ chuyền | Sản xuất (chuyền) | B14 |
| B04 | Warehouse Staff | Bắt đầu | Start |  | B05 |
| B05 | Warehouse Staff | Điểm quyết định | Request từ đâu? |  | B06 [Từ SO]; B07 [Tạo tay]; B08 [Không] |
| B06 | Warehouse Staff | Bước | Tự tạo Product Income Request khi SO Approve | System (auto) · Sales Order → Product Income | B09 |
| B07 | Warehouse Staff | Bước | Create New Request | Web · Product Income | B10 |
| B08 | Warehouse Staff | Bước | Create Product Income Slip (standalone) | Web · Product Income | B11 |
| B09 | Warehouse Staff | Bước | Submit Request | Web · Product Income | B12 [SUBMITTED] |
| B10 | Warehouse Staff | Bước | + Item → Select Item (free item) | Web · Product Income | B09 |
| B11 | Warehouse Staff | Bước | Submit for Approval | Web · Product Income | B13 [Slip SUBMITTED] |
| B12 | Warehouse Staff | Bước | Print QR Slip (QR = Request No.) | Web · Product Income | B14 |
| B13 | Warehouse Manager | Điểm quyết định | Kỳ kho của phiếu đã chốt? |  | B15 [Đã chốt]; B16 [Chưa] |
| B14 | Warehouse Staff | Bước | In tem FG QR Label theo Request, dán lên hàng | Web · Finished Goods QR Label Issue | B17 |
| B15 | 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) |
| B16 | Warehouse Manager | Bước | Approve Slip SUBMITTED → APPROVED | Web · Product Income | B18; B19 |
| B17 | Warehouse Staff | Bước | Scan QR của Request | Mobile · Product Income | B20 |
| B18 | Output | Dữ liệu | Product Income Slip = APPROVED |  | (kết thúc) |
| B19 | Warehouse Manager | Bước | Cộng Physical & Available Stock · cộng Received | System (auto) · Product Income | B21; B22 [nhánh tuỳ chọn]; B23 |
| B20 | Warehouse Staff | Bước | Scan FG QR Label → Make Slip | Mobile · Product Income | B11 |
| B21 | Output | Dữ liệu | Tồn kho thành phẩm tăng theo Warehouse · Bin |  | (kết thúc) |
| B22 | Warehouse Staff | Bước | W/H Stock Checking (view-only, tra cứu) | Web · W/H Stock Checking |  |
| B23 | Warehouse Manager | Điểm quyết định | Request còn Remaining > 0? |  | B24 [Không]; B17 [Có — nhập tiếp phần còn lại bằng Slip mới] |
| B24 | Output | Dữ liệu | Request → CLOSED (tự động) |  | B25 |
| B25 | Output | Quy trình con | Bước sau: Mapping Pallet → Goods Delivery |  |  |
| B26 | Warehouse Manager | Bắt đầu | Start |  | B27 |
| B27 | Warehouse Manager | Bước | Cancel (Slip đang APPROVED) | Web · Product Income | B28 |
| B28 | Warehouse Manager | Điểm quyết định | Đủ tồn để đảo VÀ chưa có action tiếp theo? |  | B29 [Không]; B30 [Có] |
| B29 | Output | Dữ liệu | Chặn huỷ — tồn không đủ hoặc đã có action ở màn khác |  | (kết thúc) |
| B30 | Warehouse Manager | Bước | Slip → CANCELLED trừ Stock · trừ Received | System (auto) · Product Income | B31; B32 |
| B31 | Output | Dữ liệu | Tồn kho giảm lại Slip = CANCELLED |  | (kết thúc) |
| B32 | 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ơ đồ)

#### B05 · Request từ đâu?

- Warehouse Staff
- Đến từ: B04
- Đi tới [Từ SO]: B06 · Tự tạo Product Income Request khi SO Approve
- Đi tới [Tạo tay]: B07 · Create New Request
- Đi tới [Không]: B08 · Create Product Income Slip (standalone)

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

- Warehouse Manager
- Đến từ: B11
- Đi tới [Đã chốt]: B15 · 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]: B16 · Approve Slip SUBMITTED → APPROVED

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

- Warehouse Manager
- Đến từ: B19
- Đi tới [Không]: B24 · Request → CLOSED (tự động)
- Đi tới [Có — nhập tiếp phần còn lại bằng Slip mới]: B17 · Scan QR của Request

#### B28 · Đủ tồn để đảo VÀ chưa có action tiếp theo?

- Warehouse Manager
- Đến từ: B27
- Đi tới [Không]: B29 · Chặn huỷ — tồn không đủ hoặc đã có action ở màn khác
- Đi tới [Có]: B30 · Slip → CANCELLED trừ Stock · trừ Received

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

#### Product Income 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á`

#### Product Income Slip

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

Bước chuyển:

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

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

Ghi chú trên sơ đồ:

- Chặn Cancel nếu tồn không đủ, đã có action ở màn khác, hoặc kỳ kho đã chốt

## Input

| # | Input | Loại | Đi vào bước |
| --- | --- | --- | --- |
| I-0 | Sales Order = APPROVED | Chứng từ nguồn | Tự tạo Product Income Request |
| I-1 | Item Master (thành phẩm · Variant), Warehouse, Location (Bin), User gán kho | Master data | Mọi dòng hàng |
| I-2 | Thành phẩm hoàn thành giao từ chuyền | Hàng thật | In & dán tem |

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

| Bước | Vai trò | Màn hình |
| --- | --- | --- |
| Tự tạo Product Income Request khi SO Approve | System | Sales Order → Product Income |
| Create New Request | Warehouse Staff | Product Income · Web |
| Create Product Income Slip (standalone) | Warehouse Staff | Product Income · Web |
| + Item → Select Item (free item) | Warehouse Staff | Product Income · Web |
| Submit Request · Print QR Slip | Warehouse Staff | Product Income · Web |
| In tem FG QR Label theo Request | Warehouse Staff | Finished Goods QR Label Issue · Web |
| Scan QR của Request · Scan FG QR Label → Make Slip | Warehouse Staff | Product Income · Mobile |
| Submit for Approval | Warehouse Staff | Product Income · Web |
| Approve Slip · Cancel | Warehouse Manager | Product Income · 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) | Product Income |

## Output

| # | Output | Điều kiện sinh ra |
| --- | --- | --- |
| O-1 | Product Income Request: `SAVED` → `SUBMITTED` → `CLOSED` | CLOSED tự động khi mọi dòng Remaining = 0 |
| O-2 | Product Income Slip = `APPROVED` | Manager bấm Approve Slip khi Slip đang `SUBMITTED` |
| O-3 | Physical Stock & Available Stock tăng tại Location (Bin) của từng dòng | Ngay khi Approve |
| O-4 | Received / Remaining trên dòng Request cập nhật | Slip có liên kết Request |
| O-5 | Hàng đã dán tem → đi tiếp Mapping Pallet → Goods Delivery | Sau khi nhập kho |
| O-6 | *Ngoại lệ:* Slip = `CANCELLED`, tồn kho giảm lại, Request đang CLOSED quay về SUBMITTED — hoặc bị chặn huỷ | Slip đang `APPROVED`; chặn nếu Available Stock < số lượng của Slip, hoặc đã có action ở màn khác |
