# Packing Planning Spray — Planner lập Packing Plan 3 bước (chọn Spray IN → chọn Repair Inventory → phân bổ vào Customer P.O), mỗi P.O một plan, Release Plan → RELEASED và tự tạo MOR vật tư đóng gói; plan RELEASED sang Packing Result Spray

> Fine Chemical (FC) · Module MES · v0.6 · 14/10/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: /mes/packing-planning-spray

## 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
- Planner
- 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 | Spray IN List (A + A-) — nhận ở Outsourcing Result |  | B09 |
| B02 | Input | Dữ liệu | Repair Inventory — hàng Repaired (Spray Out · Pending repair, Packing Spray · Pending repair) |  | B10 |
| B03 | Input | Dữ liệu | Remaining chưa nhập trả về — Packing Result Spray |  | B11 |
| B04 | Input | Dữ liệu | Customer P.O · ETD · P.O Month (Sales Order) |  | B11 |
| B05 | Input | Dữ liệu | Remaining P.O nguồn hoàn trả — Exchange Customer PO |  | B11 |
| B06 | Input | Dữ liệu | Master data: Packing BOM (Model · Size · Destination) | Master data | B16 |
| B07 | Planner | Bắt đầu | Start |  | B08 |
| B08 | Planner | Bước | Tạo Packing Plan | Web · Packing Planning Spray | B09 |
| B09 | Planner | Bước | Step 1 · Chọn Spray IN | Web · Packing Planning Spray | B10 |
| B10 | Planner | Bước | Step 2 · Chọn Repair Inventory | Web · Packing Planning Spray | B11 |
| B11 | Planner | Bước | Step 3 · Phân bổ vào Detail P.O | Web · Packing Planning Spray | B12 |
| B12 | Planner | Điểm quyết định | Phân bổ hợp lệ? |  | B11 [Không — sửa số]; B13 [Có] |
| B13 | Planner | Bước | Phát hành Packing Plan | Web · Packing Planning Spray | B14 |
| B14 | Planner | Bước | Tách plan theo P.O · giữ nguồn | System (auto) · Packing Planning Spray | B15; B16 |
| B15 | Output | Dữ liệu | Plan RELEASED (Waiting) → Packing Result Spray · nguồn Exchange Customer PO |  | (kết thúc) |
| B16 | Planner | Bước | Tạo MOR vật tư đóng gói (một / plan) | System (auto) · Packing Planning Spray | B17; B18 |
| B17 | Output | Dữ liệu | MOR vật tư đóng gói (tự tạo khi Release) → WMS |  | (kết thúc) |
| B18 | Planner | Kết thúc | End |  |  |
| B19 | Planner | Bắt đầu | Cần Revision |  | B20 |
| B20 | Planner | Điểm quyết định | Plan đã có Record Output? |  | B21 [Có]; B22 [Chưa] |
| B21 | Output | Dữ liệu | Revision bị khoá — plan đã có sản lượng |  | (kết thúc) |
| B22 | Planner | Bước | Tạo Revision Packing Plan | Web · Packing Planning Spray | B23; B24 |
| B23 | Output | Dữ liệu | Plan NEW · mở thẳng Step 3 để sửa số |  | (kết thúc) |
| B24 | Planner | Bước | Phát hành lại Packing Plan | Web · Packing Planning Spray | B25; B26 |
| B25 | Output | Dữ liệu | Plan RELEASED lại · giữ MOR cũ |  | (kết thúc) |
| B26 | Planner | Kết thúc | End |  |  |

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

#### B08 · Tạo Packing Plan

- Planner · Web · Packing Planning Spray
- Đến từ: B07
- Đi tới: B09 · Step 1 · Chọn Spray IN

> Planner mở trang lập Packing Plan cho hàng SPRAY đã sơn về, đang chờ đóng gói.  
> Khi nào: bất kỳ lúc nào có hàng chờ đóng gói; Release WO không sinh sẵn Packing Plan.  
> Thao tác: Packing Planning Spray › nút "Create Spray Plan" → trang "Add Packing Spray Plan".  
> Hệ thống: chỉ hàng có Model attribute của WO là Spray; hàng Logo / OOMG lập plan ở Packing Planning Logo.  
> Hệ thống: khung "Plan Details" gồm "Plan No." (Auto-generated), "P.O (Month) *" mặc định tháng đầu, "Plan Date"; thanh 3 bước, chân trang "Reset" · "Back" · "Next".  
> Kết quả: mở Step 1, chưa lưu gì.  
> Chặn khi: "P.O (Month) *" trống mà bấm "Next" ở Step 1 → "Select P.O (Month) first."  
> Kiểm thử:  
> - Bỏ trống "P.O (Month) *" rồi bấm "Next" → hiện "Select P.O (Month) first.", vẫn ở Step 1  
> Nguồn: Q-20261001-10 (OQ-93) · Q-20260929-13 · CHANGELOG v0.66 · prototype v0.70  

#### B09 · Step 1 · Chọn Spray IN

- Planner · Web · Packing Planning Spray
- Đến từ: B01, B08
- Đi tới: B10 · Step 2 · Chọn Repair Inventory

> Planner tick hàng SPRAY đã sơn về làm nguồn của plan.  
> Thao tác: Step 1 · "Select Spray IN" › tick ô chọn từng dòng.  
> Hệ thống: bảng là A + A- nhận ở Outsourcing Result, mỗi dòng mang LOT No., Grade và P.O đã gán ở Outsourcing Planning; Step 1 chỉ chọn, không phân bổ.  
> Kết quả: dòng đã tick cộng vào "Selected Stock (by size)" của Step 3; Step 3 chỉ hiện P.O ghi trên dòng Spray IN.  
> Kiểm thử:  
> - Tick một dòng Spray IN mang P.O 260811-07 → Step 3 chỉ hiện P.O 260811-07  
> Nguồn: Q-20261001-10 (OQ-93) · Q-20261002-02 (3) · CHANGELOG v0.66 · prototype v0.70  

#### B10 · Step 2 · Chọn Repair Inventory

- Planner · Web · Packing Planning Spray
- Đến từ: B02, B09
- Đi tới: B11 · Step 3 · Phân bổ vào Detail P.O

> Planner chọn thêm hàng đã sửa xong trong Repair Inventory để bù cho plan; bước này không bắt buộc.  
> Thao tác: Step 2 · "Select Repair Inventory" › tick dòng đã sửa; "Back" về Step 1, "Next" sang Step 3.  
> Hệ thống: chỉ dòng đã Repaired tick được, lấy từ phiếu Repair / Rework có Source "Spray Out · Pending repair" hoặc "Packing Spray · Pending repair"; Step 2 chỉ chọn, không phân bổ.  
> Kết quả: dòng đã tick cộng vào "Selected Stock (by size)"; khi phân bổ, hàng Repair được dùng trước.  
> Kiểm thử:  
> - Không tick dòng nào, bấm "Next" → vào Step 3 với nguồn chỉ từ Step 1  
> - Phiếu RW "Spray Out · Pending repair" ghi Repaired 10 đôi → Step 2 có dòng 10 đôi chọn được  
> Hệ thống: hàng "Spray Out · Pending repair" sửa xong đi thẳng vào Step 2 này, không quay về Step 2 của Outsourcing Planning; C nhận ở Outsourcing Result là hàng hỏng, ghi Defect Records, không vào Step 2.  
> Nguồn: Q-20261013-01 · Q-20261007-01 · Q-20260929-06 · prototype v0.91  

#### B11 · Step 3 · Phân bổ vào Detail P.O

- Planner · Web · Packing Planning Spray
- Đến từ: B03, B04, B05, B10, B12
- Đi tới: B12 · Phân bổ hợp lệ?

> Planner chia hàng đã chọn cho từng Customer P.O theo size; đây là bước duy nhất phân bổ.  
> Thao tác: Step 3 · "Allocate to Detail P.O" › nút "Allocate" / "Remove" ở cột "Action" từng P.O · nút "Auto Allocate" · gõ số dòng "Allocated".  
> Hệ thống: P.O khớp Model, Base Color, Upper Color, AL / INT và cùng "P.O (Month)", chỉ P.O ghi trên dòng Spray IN; "Remaining" = số đặt của P.O − số các Packing Plan khác đang giữ, cộng phần Remaining chưa nhập trả về từ Packing Result Spray (Pending repair không trả về, đi Repair / Rework) và balance hoàn trả từ Exchange Customer PO.  
> Hệ thống: "Auto Allocate" lấp P.O có ETD sớm trước, hàng Repair trước; "Selected Stock (by size)" cập nhật "Allocated to P.O" và "Not Allocated".  
> Kết quả: dưới bảng hiện "Packing Plan summary" theo P.O; chân trang có nút "Release Plan".  
> Kiểm thử:  
> - P.O vừa được Exchange Customer PO hoàn trả 30 đôi W5 → "Remaining" W5 của P.O đó tăng 30  
> Nguồn: Q-20261013-01 · Q-20261001-06 · Q-20261002-03 · Q-20260929-06, -08 · CHANGELOG v0.58 · prototype v0.91  

#### B12 · Phân bổ hợp lệ?

- Planner
- Đến từ: B11
- Đi tới [Không — sửa số]: B11 · Step 3 · Phân bổ vào Detail P.O
- Đi tới [Có]: B13 · Phát hành Packing Plan

> Hệ thống kiểm số phân bổ trước khi lưu hoặc Release.  
> Có: mỗi P.O có "Allocated" theo size ≤ hàng đã chọn và ≤ "Remaining" của P.O, tổng > 0, có "Plan Date" → cho "Release Plan".  
> Không: báo lỗi và sửa số — "P.O … / <size>: n pairs more than the selected stock" · "<size>: total Packing quantity exceeds the current P.O balance." · "Allocate at least one pair to a Detail P.O." · "Enter a Plan Date."  
> Kiểm thử:  
> - Gõ "Allocated" W5 lớn hơn "Remaining" W5 một đôi → báo vượt balance của P.O, không Release được  
> Nguồn: prototype v0.70  

#### B13 · Phát hành Packing Plan

- Planner · Web · Packing Planning Spray
- Đến từ: B12
- Đi tới: B14 · Tách plan theo P.O · giữ nguồn

> Planner phát hành các plan vừa phân bổ; không có bước lưu nháp và không có người duyệt.  
> Khi nào: Step 3 của trang lập plan, khi phân bổ đã hợp lệ.  
> Thao tác: Step 3 › nút "Release Plan" → popup "Release n Packing Plan(s)?" liệt kê "PKP-… → P.O …" và bảng "P.O · Source" theo size → nút "Confirm & Release".  
> Kết quả: plan → RELEASED, hiện ở "Packing List" với trạng thái "Released".  
> Kiểm thử:  
> - Bấm "Cancel" trong popup → không sinh plan  
> - Step 3 không có nút "Save Draft"  
> Nguồn: Q-20261012-06 · Q-20261007-03 · prototype v0.90  

#### B14 · Tách plan theo P.O · giữ nguồn

- Planner · System (auto) · Packing Planning Spray
- Đến từ: B13
- Đi tới: B15 · Plan RELEASED (Waiting) → Packing Result Spray · nguồn Exchange Customer PO
- Đi tới: B16 · Tạo MOR vật tư đóng gói (một / plan)

> Hệ thống tạo plan cho từng P.O đã phân bổ và giữ nguồn cho plan.  
> Hệ thống: mỗi P.O một Packing Plan, số "PKP-<YYYYMMDD>-NN" theo ngày plan; dòng plan ghi LOT / Repair No., WO, Grade theo size.  
> Kết quả: plan RELEASED hiện ở Packing Result Spray với trạng thái "Waiting"; nguồn đã phân bổ bị giữ, phần dùng hết không còn hiện ở trang lập plan khác.  
> Kiểm thử:  
> - Release plan dùng hết một dòng nguồn → trang "Create Spray Plan" mới không còn dòng đó ở Step 1  
> Nguồn: Q-20261012-06 · Q-20261007-03 · prototype v0.90  

#### B16 · Tạo MOR vật tư đóng gói (một / plan)

- Planner · System (auto) · Packing Planning Spray
- Đến từ: B14, B06
- Đi tới: B17 · MOR vật tư đóng gói (tự tạo khi Release) → WMS
- Đi tới: B18 · End

> Hệ thống tạo một MOR vật tư đóng gói cho plan vừa Release; Planner không tạo MOR tay.  
> Hệ thống: vật tư lấy từ Packing BOM theo Model + Size + Destination; nhu cầu từng vật tư theo size = ⌈số đôi của plan × Qty dòng ÷ Quantity (đôi / thùng)⌉; Issue From "WH-PK-01 / Packing Store".  
> Kết quả: MOR "MOR-PK-…" trạng thái "Requested", By "System (on Release)" → WMS xuất vật tư; cột "MOR" của "Packing List" hiện số MOR, plan chưa có MOR hiện "—".  
> Không áp: plan sinh từ Exchange Customer PO không tạo MOR mới — plan đó mang số MOR của plan nguồn.  
> Kiểm thử:  
> - Size W5 360 đôi, Quantity 12 đôi / thùng, "F2 Carton box" Qty 1 → 30 thùng  
> - Cột "MOR" và trang chi tiết plan không có nút "Create MOR"  
> Nguồn: Q-20261012-06 · Q-20261007-03 · Q-20261001-08 · BRD §6.2 · prototype v0.90 · Q-20261014-02  

#### B20 · Plan đã có Record Output?

- Planner
- Đến từ: B19
- Đi tới [Có]: B21 · Revision bị khoá — plan đã có sản lượng
- Đi tới [Chưa]: B22 · Tạo Revision Packing Plan

> Hệ thống xét plan đã Release còn sửa được không.  
> Chưa: plan RELEASED chưa có Record Output ở Packing Result Spray → có nút "Revision".  
> Có: plan đã có Record Output → không có nút "Revision"; gọi lệnh vẫn bị chặn bằng "Packing has started or this plan is not Released. Revision is unavailable."  
> Nguồn: Q-20261012-06 · Q-20261007-03 · prototype v0.90  

#### B22 · Tạo Revision Packing Plan

- Planner · Web · Packing Planning Spray
- Đến từ: B20
- Đi tới: B23 · Plan NEW · mở thẳng Step 3 để sửa số
- Đi tới: B24 · Phát hành lại Packing Plan

> Planner mở lại plan đã Release để sửa số khi chưa đóng gói.  
> Khi nào: plan RELEASED, chưa có Record Output.  
> Thao tác: trang chi tiết plan › nút "Revision".  
> Kết quả: plan → NEW, lưu lịch sử bản trước; mở plan NEW thì vào thẳng Step 3 của trang sửa plan.  
> Kiểm thử:  
> - Plan NEW không có nút "Reject", "Delete" hay "Save Draft"  
> Nguồn: Q-20261012-06 · Q-20261007-03 · prototype v0.90  

#### B24 · Phát hành lại Packing Plan

- Planner · Web · Packing Planning Spray
- Đến từ: B22
- Đi tới: B25 · Plan RELEASED lại · giữ MOR cũ
- Đi tới: B26 · End

> Planner sửa số rồi phát hành lại plan NEW.  
> Thao tác: Step 3 của trang sửa plan › sửa "Allocated" → nút "Release Plan" → "Confirm & Release"; hoặc trang chi tiết › "Edit quantities" → "Release Packing Plan".  
> Kết quả: plan → RELEASED; MOR đã tạo được giữ, không tạo MOR mới.  
> Kiểm thử:  
> - Revision plan có MOR-PK-2602 rồi Release lại → cột "MOR" vẫn MOR-PK-2602  
> Chưa chốt: số lượng MOR có cập nhật theo plan đã sửa không (OQ-90).  
> Nguồn: Q-20261012-06 · Q-20261007-03 · prototype v0.90  

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

#### Packing Plan

`NEW` → `RELEASED` → `COMPLETED`

Bước chuyển:

- `NEW` -- Release Packing Plan --> `RELEASED`
- `RELEASED` -- Packing Result Spray đủ ORDER --> `COMPLETED`
- `RELEASED` -- Revision — chưa Record Output --> `NEW` (quay lại)

Ghi chú trên sơ đồ:

- Plan mới: Release Plan ở Step 3 vào thẳng RELEASED

## Input

| # | Input | Loại | Đi vào bước |
| --- | --- | --- | --- |
| I-1 | Spray IN List — hàng A + A- nhận ở Outsourcing Result, mỗi dòng mang LOT No. và P.O đã gán ở Outsourcing Planning | Bể tồn công đoạn — flow Spray Out / Outsourcing | Step 1 · Chọn Spray IN |
| I-2 | Repair Inventory — hàng đã sửa xong (Repaired) ở Repair / Rework, mỗi dòng mang LOT No. nơi phát sinh lỗi | Bể tồn công đoạn — flow Repair / Rework | Step 2 · Chọn Repair Inventory |
| I-3 | Remaining chưa nhập của plan ở Packing Result Spray, trả về balance P.O (Pending repair không trả về — đi Repair / Rework) | Chứng từ — flow Packing Result Spray | Step 3 · Phân bổ vào Detail P.O |
| I-4 | Customer P.O theo size — Model, Base Color, Upper Color, AL / INT, Destination, ETD, P.O Month | Chứng từ — Sales Order | Step 3 · Phân bổ vào Detail P.O |
| I-5 | Remaining (balance) của P.O nguồn được hoàn trả khi phiếu Exchange Customer PO `CONFIRMED` | Chứng từ — flow Exchange Customer PO | Step 3 · Phân bổ vào Detail P.O |
| I-6 | Packing BOM — khoá Model + Size + Destination; header Quantity = số đôi / thùng; Qty dòng tính cho 1 thùng | Master data | Tạo MOR vật tư đóng gói (một / plan) |

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

| Bước | Vai trò | Màn hình · nút trên UI |
| --- | --- | --- |
| Tạo Packing Plan · Step 1 · Chọn Spray IN · Step 2 · Chọn Repair Inventory · Step 3 · Phân bổ vào Detail P.O | Planner | Packing Planning Spray · `Create Spray Plan` → `Add Packing Spray Plan` (`Select Spray IN` · `Select Repair Inventory` · `Allocate to Detail P.O`) |
| Phát hành Packing Plan | Planner | Packing Planning Spray · Step 3 · `Release Plan` → `Confirm & Release` |
| Tạo Revision Packing Plan · Phát hành lại Packing Plan | Planner | Packing Planning Spray · trang chi tiết plan · `Revision`; plan NEW · Step 3 · `Release Plan` → `Confirm & Release`, hoặc `Edit quantities` → `Release Packing Plan` |
| Tách plan theo P.O · giữ nguồn · Tạo MOR vật tư đóng gói (một / plan) | System (auto) | Packing Planning Spray |

## Output

| # | Output | Điều kiện sinh ra |
| --- | --- | --- |
| O-1 | Plan `RELEASED` trạng thái Waiting → Packing Result Spray để Packing Operator nhập kết quả đóng gói; plan chưa đóng gói hết là nguồn của Exchange Customer PO | Planner bấm Release Plan → Confirm & Release ở Step 3 |
| O-2 | MOR vật tư đóng gói (MOR-PK-…, Requested, Issue From WH-PK-01) — một MOR / plan, tự tạo khi Release → WMS xuất kho. Plan sinh từ Exchange Customer PO không tạo MOR mới, dùng MOR của plan nguồn | Release plan chưa có MOR |
| O-3 | Revision bị khoá — plan đã có sản lượng | Planner xem plan đã có Record Output |
| O-4 | Plan về `NEW`, mở thẳng Step 3 để sửa số | Planner bấm Revision trên plan `RELEASED` chưa có Record Output |
| O-5 | Plan `RELEASED` lại — MOR đã tạo được giữ, không tạo thêm | Planner phát hành lại plan `NEW` |

## Thuật ngữ

| Thuật ngữ | Nghĩa trong flow này |
| --- | --- |
| `P.O` | Customer P.O — đơn hàng của khách; mỗi Packing Plan thuộc đúng một P.O |
| `P.O Month` | Tháng của P.O; bắt buộc chọn ở Plan Details; LOT từ Trimming Result chỉ phân bổ được cho P.O cùng P.O Month |
| `ETD` | Ngày dự kiến xuất hàng của P.O — Auto Allocate lấp P.O có ETD sớm trước |
| `LOT` | Lô sản xuất theo ca (mã đuôi AB ca ngày, CD ca đêm), mang theo từ Curing qua Trimming |
| `Logo / SPRAY · OOMG` | Loại hàng theo Model attribute của WO; Logo và SPRAY loại trừ nhau, hàng OOMG đi theo luồng Logo |
| `AL / INT` | Thị trường của P.O (nguyên văn cột trên prototype) — một điều kiện khớp nguồn với P.O |
| `Spray IN List` | Hàng A + A- đã sơn về, nhận ở Outsourcing Result, đã mang P.O |
| `Repair Inventory` | Hàng đã sửa xong (Repaired) ở Repair / Rework, chờ dùng lại |
| `Selected Stock (by size)` | Tổng hàng đã chọn ở Step 1 và Step 2 theo size: Selected · Allocated to P.O · Not Allocated |
| `Detail P.O · Remaining · Allocated` | Bảng P.O khớp nguồn ở Step 3: Remaining = số đặt của P.O − số các Packing Plan khác đang giữ; Allocated là số phân bổ cho P.O trong plan đang lập |
| `Plan Qty` | Tổng Allocated của plan theo size (Daily Packing Q'ty) — căn cứ tính Remaining ở Packing Result và vật tư của MOR |
| `Packing BOM` | Định mức vật tư đóng gói theo Model + Size + Destination; Quantity = số đôi / thùng; Qty dòng tính cho 1 thùng |
| `MOR` | Material Out Request — yêu cầu kho WH-PK-01 xuất vật tư đóng gói; một MOR / plan, tự tạo khi Release; plan sinh từ Exchange Customer PO mang số MOR của plan nguồn |
| `Exchange Customer PO (EXC)` | Chức năng riêng đổi hàng giữa các Customer P.O — xem flow Exchange Customer PO |
