# Product Label Issue — sinh, in, quét, in lại và huỷ tem QR thành phẩm theo inbound request

> Fine Chemical (FC) · Module WMS · v1.0 · 23/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-label-issue

## 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 · QA
- 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 | Product Income Request (tạo từ Sales Order) |  | B10 |
| B02 | Input | Dữ liệu | Subcontract inbound (Purchasing / Production) |  | B10 |
| B03 | Input | Dữ liệu | Return / re-pack inbound |  | B10 |
| B04 | Input | Dữ liệu | Master data: Item (variant · carton pack) Warehouse · Printer · Label stock | Master data | B11 |
| B05 | Input | Dữ liệu | Label register (tem QR đã sinh) |  | B31; B44 |
| B06 | Input | Dữ liệu | Product Income Slip: Cancel · Delete Slip SAVED · bỏ dòng tem khỏi Slip |  | B53 |
| B07 | Input | Dữ liệu | Product Income Slip CANCELLED được Approve lại |  | B55 |
| B08 | Warehouse Staff | Bắt đầu | Start |  | B09 |
| B09 | Warehouse Staff | Bước | Chọn Inbound type Production · Subcontract Return / re-pack inbound | Web · Product Label Issue | B10 |
| B10 | Warehouse Staff | Bước | Chọn Inbound request còn Outstanding (Product Income Request phải SUBMITTED) → nạp header + dòng | Web · Product Label Issue | B11 |
| B11 | Warehouse Staff | Bước | Chọn Remainder rule (mặc định Last label carries remainder) nhập Qty to label · Qty / label từng dòng (bulk: All remaining, Qty / label = carton pack) | Web · Product Label Issue | B12 |
| B12 | Warehouse Staff | Điểm quyết định | Các dòng hợp lệ? |  | B13 [Không]; B14 [Hợp lệ] |
| B13 | Warehouse Staff | Bước | Báo lỗi ngay tại dòng: vượt Outstanding còn lại Qty / label > Qty to label không chia hết (rule Block) → khoá Save as draft · Generate | System (auto) · Product Label Issue | B11 |
| B14 | Warehouse Staff | Bước | Tính số tem mỗi dòng: Qty to label ÷ Qty / label làm tròn lên, tem cuối mang phần dư | System (auto) · Product Label Issue | B15 |
| B15 | Warehouse Staff | Điểm quyết định | Chọn action? |  | B16 [Save as draft]; B17 [Generate] |
| B16 | Output | Dữ liệu | Bản nháp (Save as draft) chưa sinh tem |  | (kết thúc) |
| B17 | Warehouse Staff | Bước | Kiểm lại Outstanding + sinh tem → ISSUED: số tem + serial không trùng, QR khoá Item Variant · Qty · ghi Labelled lũy kế về dòng request | System (auto) · Product Label Issue | B18; B19 |
| B18 | Output | Dữ liệu | Dòng request: Labelled lũy kế → Outstanding cho lần sau |  | (kết thúc) |
| B19 | Warehouse Staff | Điểm quyết định | Generate & print? |  | B20 [Không]; B21 [Có] |
| B20 | Output | Dữ liệu | Tem ISSUED chưa in in sau ở Label inquiry |  | (kết thúc) |
| B21 | Warehouse Staff | Bước | Print labels: Printer · Copies Label stock · Start at position → Send to printer | Web · Product Label Issue | B22 |
| B22 | Warehouse Staff | Điểm quyết định | Máy in in được? |  | B23 [Không (máy in lỗi)]; B24 [In được] |
| B23 | Output | Dữ liệu | Tem giữ ISSUED Prints không tăng |  | (kết thúc) |
| B24 | Warehouse Staff | Bước | Tem ISSUED → PRINTED Prints + 1 · ghi audit trail | System (auto) · Product Label Issue | B25; B26 |
| B25 | Output | Dữ liệu | Tem PRINTED dán lên thùng / pallet |  | (kết thúc) |
| B26 | Warehouse Staff | Bước | Quét QR tem PRINTED khi put-away | Mobile · Product Income | B27 |
| B27 | Warehouse Staff | Điểm quyết định | Tem PRINTED, serial còn dùng được? |  | B28 [Không (trùng / đã huỷ)]; B29 [Chưa] |
| B28 | Output | Dữ liệu | Từ chối quét — trùng serial / tem đã huỷ · không nạp Qty ghi log |  | (kết thúc) |
| B29 | Warehouse Staff | Bước | Nạp đúng Qty trên QR vào Slip (ô Qty khoá) · serial đã dùng · PRINTED → SCANNED | System (auto) · Product Income | B30 |
| B30 | Output | Dữ liệu | Tem SCANNED — Cancel phải đảo nhập kho trước |  | (kết thúc) |
| B31 | Warehouse Staff | Bắt đầu | Start |  | B32 |
| B32 | Warehouse Staff | Bước | Label inquiry: tìm tem Label no. / QR · Item · Variant Inbound request · Status | Web · Product Label Issue | B33 |
| B33 | Warehouse Staff | Điểm quyết định | Tem đang? |  | B34 [Đã in / quét / huỷ]; B35 [ISSUED] |
| B34 | Warehouse Staff | Bước | Reprint: chọn một / nhiều tem + Reprint reason chung (bắt buộc) → Send to printer | Web · Product Label Issue | B36 |
| B35 | Warehouse Staff | Bước | Print: chọn một / nhiều tem ISSUED, chọn Printer (không cần Reprint reason) | Web · Product Label Issue | B37 |
| B36 | Warehouse Staff | Điểm quyết định | In thành công? |  | B38 [Không]; B39 [Có] |
| B37 | Warehouse Staff | Điểm quyết định | In thành công? |  | B40 [Không]; B41 [Có] |
| B38 | Output | Dữ liệu | Reprint lỗi — Prints và audit không đổi |  | (kết thúc) |
| B39 | Warehouse Staff | Bước | Giữ số tem + serial trạng thái không đổi Prints + 1 · audit từng tem | System (auto) · Product Label Issue | B42 |
| B40 | Output | Dữ liệu | Tem giữ ISSUED (in lỗi) Prints không tăng |  | (kết thúc) |
| B41 | Warehouse Staff | Bước | Tem ISSUED → PRINTED Prints + 1 · ghi audit trail | System (auto) · Product Label Issue | B43 |
| B42 | Output | Dữ liệu | Tem in lại cùng số tem + serial, không thêm tem mới |  | (kết thúc) |
| B43 | Output | Dữ liệu | Tem PRINTED (in lần đầu) dán lên thùng / pallet |  | (kết thúc) |
| B44 | Warehouse Manager · QA | Bắt đầu | Start |  | B45 |
| B45 | Warehouse Manager · QA | Bước | Label inquiry: tìm tem cần huỷ (nút Cancel label chỉ hiện với Manager · QA) | Web · Product Label Issue | B46 |
| B46 | Warehouse Manager · QA | Điểm quyết định | Tem đang ISSUED / PRINTED? |  | B47 [Không]; B48 [Có] |
| B47 | Output | Dữ liệu | Chặn huỷ — tem SCANNED (đảo nhập kho trước) / CANCELLED giữ nguyên |  | (kết thúc) |
| B48 | Warehouse Manager · QA | Bước | Cancel label: chọn lý do + Remark · xác nhận đã huỷ tem vật lý (bắt buộc) | Web · Product Label Issue | B49 |
| B49 | Warehouse Manager · QA | Điểm quyết định | Xác nhận Cancel label? |  | B50 [Keep label]; B51 [Cancel label] |
| B50 | Output | Dữ liệu | Keep label tem giữ nguyên trạng thái |  | (kết thúc) |
| B51 | Warehouse Manager · QA | Bước | Tem → CANCELLED, serial huỷ Qty trả lại Outstanding dòng request · ghi audit trail | System (auto) · Product Label Issue | B52 |
| B52 | Output | Dữ liệu | Tem CANCELLED Outstanding dòng request tăng lại |  | (kết thúc) |
| B53 | Warehouse Staff | Bước | Tem SCANNED → PRINTED mở lại serial (quét lại được) ghi audit trail | System (auto) · Product Income | B54 |
| B54 | Output | Dữ liệu | Tem PRINTED — quét lại hoặc Cancel label được |  | (kết thúc) |
| B55 | Warehouse Staff | Điểm quyết định | Tem vẫn PRINTED, chưa quét lại? |  | B56 [Không]; B57 [Có] |
| B56 | Output | Dữ liệu | Chặn Approve lại — tem đã quét vào Slip khác / đã huỷ |  | (kết thúc) |
| B57 | Warehouse Staff | Bước | Tem PRINTED → SCANNED serial đã dùng · ghi audit | System (auto) · Product Income | B58 |
| B58 | Output | Dữ liệu | Tem SCANNED lại theo Slip được Approve lại |  | (kết thúc) |

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

#### B12 · Các dòng hợp lệ?

- Warehouse Staff
- Đến từ: B11
- Đi tới [Không]: B13 · Báo lỗi ngay tại dòng: vượt Outstanding còn lại Qty / label > Qty to label không chia hết (rule Block) → khoá Save as draft · Generate
- Đi tới [Hợp lệ]: B14 · Tính số tem mỗi dòng: Qty to label ÷ Qty / label làm tròn lên, tem cuối mang phần dư

#### B15 · Chọn action?

- Warehouse Staff
- Đến từ: B14
- Đi tới [Save as draft]: B16 · Bản nháp (Save as draft) chưa sinh tem
- Đi tới [Generate]: B17 · Kiểm lại Outstanding + sinh tem → ISSUED: số tem + serial không trùng, QR khoá Item Variant · Qty · ghi Labelled lũy kế về dòng request

#### B19 · Generate & print?

- Warehouse Staff
- Đến từ: B17
- Đi tới [Không]: B20 · Tem ISSUED chưa in in sau ở Label inquiry
- Đi tới [Có]: B21 · Print labels: Printer · Copies Label stock · Start at position → Send to printer

#### B22 · Máy in in được?

- Warehouse Staff
- Đến từ: B21
- Đi tới [Không (máy in lỗi)]: B23 · Tem giữ ISSUED Prints không tăng
- Đi tới [In được]: B24 · Tem ISSUED → PRINTED Prints + 1 · ghi audit trail

#### B27 · Tem PRINTED, serial còn dùng được?

- Warehouse Staff
- Đến từ: B26
- Đi tới [Không (trùng / đã huỷ)]: B28 · Từ chối quét — trùng serial / tem đã huỷ · không nạp Qty ghi log
- Đi tới [Chưa]: B29 · Nạp đúng Qty trên QR vào Slip (ô Qty khoá) · serial đã dùng · PRINTED → SCANNED

#### B33 · Tem đang?

- Warehouse Staff
- Đến từ: B32
- Đi tới [Đã in / quét / huỷ]: B34 · Reprint: chọn một / nhiều tem + Reprint reason chung (bắt buộc) → Send to printer
- Đi tới [ISSUED]: B35 · Print: chọn một / nhiều tem ISSUED, chọn Printer (không cần Reprint reason)

#### B36 · In thành công?

- Warehouse Staff
- Đến từ: B34
- Đi tới [Không]: B38 · Reprint lỗi — Prints và audit không đổi
- Đi tới [Có]: B39 · Giữ số tem + serial trạng thái không đổi Prints + 1 · audit từng tem

#### B37 · In thành công?

- Warehouse Staff
- Đến từ: B35
- Đi tới [Không]: B40 · Tem giữ ISSUED (in lỗi) Prints không tăng
- Đi tới [Có]: B41 · Tem ISSUED → PRINTED Prints + 1 · ghi audit trail

#### B46 · Tem đang ISSUED / PRINTED?

- Warehouse Manager · QA
- Đến từ: B45
- Đi tới [Không]: B47 · Chặn huỷ — tem SCANNED (đảo nhập kho trước) / CANCELLED giữ nguyên
- Đi tới [Có]: B48 · Cancel label: chọn lý do + Remark · xác nhận đã huỷ tem vật lý (bắt buộc)

#### B49 · Xác nhận Cancel label?

- Warehouse Manager · QA
- Đến từ: B48
- Đi tới [Keep label]: B50 · Keep label tem giữ nguyên trạng thái
- Đi tới [Cancel label]: B51 · Tem → CANCELLED, serial huỷ Qty trả lại Outstanding dòng request · ghi audit trail

#### B55 · Tem vẫn PRINTED, chưa quét lại?

- Warehouse Staff
- Đến từ: B07
- Đi tới [Không]: B56 · Chặn Approve lại — tem đã quét vào Slip khác / đã huỷ
- Đi tới [Có]: B57 · Tem PRINTED → SCANNED serial đã dùng · ghi audit

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

#### FG QR label (tem QR thành phẩm)

`ISSUED` → `PRINTED` → `SCANNED` → `CANCELLED`

Bước chuyển:

- `ISSUED` -- Send to printer · Print lần đầu --> `PRINTED`
- `PRINTED` -- Quét QR · Slip duyệt lại (auto) --> `SCANNED`
- `PRINTED` -- Cancel label — tem đã in --> `CANCELLED` (quay lại)
- `ISSUED` -- Cancel label — tem chưa in --> `CANCELLED` (quay lại)
- `SCANNED` -- Cancel / Delete Product Income Slip (đảo nhập kho) --> `PRINTED` (quay lại)

## Input

| # | Input | Loại | Đi vào bước |
| --- | --- | --- | --- |
| I-1 | Product Income Request — tạo từ Sales Order (flow Product Income); Work order no. chỉ là field tham chiếu trên header | Inbound request | Chọn Inbound request |
| I-2 | Subcontract inbound — Purchasing / Production | Inbound request | Chọn Inbound request |
| I-3 | Return / re-pack inbound | Inbound request | Chọn Inbound request |
| I-4 | Item (variant · carton pack) · Warehouse · Printer · Label stock | Master data | Nhập Qty to label · Qty / label; Print labels |
| I-5 | Label register — tem QR đã sinh | Dữ liệu của chính màn này | Label inquiry: tìm tem |
| I-6 | Product Income Slip: Cancel · Delete Slip SAVED · bỏ dòng tem khỏi Slip (đảo nhập kho) | Sự kiện từ màn Product Income | Tem SCANNED → PRINTED |
| I-7 | Product Income Slip CANCELLED được Approve lại | Sự kiện từ màn Product Income | Tem vẫn PRINTED, chưa quét lại? |

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

| Bước | Vai trò | Màn hình |
| --- | --- | --- |
| Chọn Inbound type · chọn Inbound request qua picker (tìm theo Request no. · Warehouse · Request date) — chỉ request còn Outstanding, Product Income Request phải SUBMITTED; header chỉ đọc; đổi request thì nạp lại dòng và xoá số lượng đã nhập | Warehouse Staff (Packing Operator) | Product Label Issue · Web |
| Chọn Remainder rule (mặc định Last label carries remainder) · nhập Qty to label · Qty / label từng dòng (bulk: All remaining qty, Qty per label = carton pack); dòng Fully labelled bị khoá ô số lượng | Warehouse Staff (Packing Operator) | Product Label Issue · Web |
| Kiểm dòng (CR-10: Qty to label ≤ Outstanding · Qty / label ≤ Qty to label · rule Block phải chia hết) · tính số tem (CR-09) | System (auto) | Product Label Issue |
| Save as draft · Generate labels · Generate & print (xem trước tem và QR payload `FG \| item \| V:variant \| Q:qty \| U:uom \| S:serial \| R:request`) | Warehouse Staff (Packing Operator) | Product Label Issue · Web |
| Kiểm lại Outstanding + sinh tem ISSUED (số tem và serial không trùng, kể cả khi nhiều chuyền cùng sinh) + ghi Labelled lũy kế về dòng request — một giao dịch; vượt Outstanding hoặc lỗi thì không sinh tem nào. Qty trên QR cố định, sai thì phải huỷ tem và sinh lại | System (auto) | Product Label Issue |
| Print labels (Printer · Copies · Label stock · Start at position) → tem PRINTED, Prints + 1; dán một tem cho mỗi thùng / pallet | Warehouse Staff (Packing Operator) | Product Label Issue · Web |
| Quét QR tem PRINTED khi put-away | Warehouse Staff (Warehouse Officer) | Product Income · Mobile |
| Tem PRINTED và serial còn dùng được: nạp đúng Qty trên QR vào Slip (ô Qty khoá, không sửa được) · serial đã dùng · tem PRINTED → SCANNED. Serial đã dùng hoặc tem đã huỷ (kể cả tem CANCELLED được in lại): từ chối quét, không nạp Qty, ghi log — cùng một giao dịch với việc dùng serial | System (auto) | Product Income |
| Label inquiry · Print lần đầu (một / nhiều tem ISSUED, không cần Reprint reason) → tem PRINTED, Prints + 1 | Warehouse Staff | Product Label Issue · Web |
| Label inquiry · Reprint (một / nhiều tem PRINTED / SCANNED / CANCELLED, một Reprint reason chung bắt buộc) — giữ số tem + serial, trạng thái không đổi, Prints + 1, không sinh thêm tem quét được; in thành công mới ghi audit trail cho từng tem | Warehouse Staff | Product Label Issue · Web |
| Label inquiry · Cancel label (bắt buộc lý do + xác nhận đã huỷ tem vật lý; inbound request bị huỷ thì huỷ với lý do Inbound request cancelled) — không phải bước duyệt: nút Cancel label chỉ hiện với Manager · QA; tem SCANNED bị chặn, phải Cancel Product Income Slip trước | Warehouse Manager · QA (Warehouse Supervisor / QA) | Product Label Issue · Web |
| Product Income Slip bị Cancel, Slip SAVED bị Delete hoặc dòng tem bị bỏ khỏi Slip (đảo nhập kho) → tem SCANNED → PRINTED, mở lại serial (quét lại hoặc Cancel label được), ghi audit trail | System (auto) | Product Income |
| Product Income Slip CANCELLED được Approve lại: tem vẫn PRINTED và chưa quét lại → tem PRINTED → SCANNED, serial đã dùng; tem đã quét vào Slip khác hoặc đã huỷ → chặn Approve lại | System (auto) | Product Income |

## Output

| # | Output | Điều kiện sinh ra |
| --- | --- | --- |
| O-1 | Bản nháp (Save as draft), chưa sinh tem | Chọn Save as draft |
| O-2 | Dòng request: Labelled lũy kế → Outstanding cho lần sau | Sinh tem thành công |
| O-3 | Tem = `ISSUED` chưa in, in sau ở Label inquiry | Chọn Generate labels (không in ngay) |
| O-4 | Tem giữ `ISSUED`, Prints không tăng | Máy in không in được |
| O-5 | Tem = `PRINTED` dán lên thùng / pallet | In thành công |
| O-6 | Từ chối quét — trùng serial / tem đã huỷ, không nạp Qty, ghi log | Quét QR có serial đã dùng, hoặc tem không còn PRINTED |
| O-7 | Tem = `SCANNED` — Cancel phải đảo nhập kho trước | Quét QR lần đầu ở Product Income |
| O-8 | Reprint lỗi — Prints và audit không đổi | Máy in không in được khi Reprint |
| O-9 | Tem in lại cùng số tem + serial, không thêm tem mới | Reprint thành công |
| O-10 | Tem giữ `ISSUED` (in lỗi), Prints không tăng | Máy in không in được khi in lần đầu |
| O-11 | Tem = `PRINTED` (in lần đầu) dán lên thùng / pallet | Print tem `ISSUED` thành công |
| O-12 | Chặn huỷ — tem `SCANNED` (đảo nhập kho trước) / `CANCELLED` giữ nguyên | Tem đã được quét nhập kho, hoặc đã huỷ trước đó |
| O-13 | Keep label — tem giữ nguyên trạng thái | Người huỷ chọn Keep label |
| O-14 | Tem = `CANCELLED`; Outstanding dòng request tăng lại | Cancel label đủ lý do + xác nhận huỷ tem vật lý |
| O-15 | Tem = `PRINTED` — quét lại hoặc Cancel label được | Product Income Slip của tem bị Cancel / Delete, hoặc dòng tem bị bỏ khỏi Slip |
| O-16 | Chặn Approve lại — tem đã quét vào Slip khác / đã huỷ | Approve lại Slip CANCELLED khi tem không còn PRINTED |
| O-17 | Tem = `SCANNED` lại theo Slip được Approve lại | Approve lại Slip CANCELLED khi tem vẫn PRINTED |
