# อะไหล่และคลังสินค้า (Spare Parts & Warehouse)

> **ฟีเจอร์นี้ทำอะไร** — จัดการคลังอะไหล่หลายคลัง: สร้าง/แก้ไขรายการอะไหล่, ตั้งค่าสต็อกต่อคลัง, อนุมัติ/ปฏิเสธคำขอเบิก (Requisition), จัดการการโอนย้าย (Transfer) และการคืนอะไหล่ (Return), ดูประวัติการใช้อะไหล่ต่อใบงาน และเฝ้าระวังสต็อกต่ำ
>
> **ใครใช้งาน** — ผู้ดูแลระบบ (Admin), เจ้าหน้าที่คลังสินค้า (Warehouse Staff)
>
> **เข้าถึงได้ที่ไหน** — เมนูด้านซ้าย (sidebar) → **Spare Parts** (อะไหล่)
>
> **ข้อกำหนดที่เกี่ยวข้อง** — FR-014 (Admin Spare Parts Management), UF-014
>
> **โมดูลในโค้ดเบส** — `spare-part-stock`, `spare-part-request`, `spare-part-location`, `spare-part-transaction`, `spare-part-used`, `spare-part-return`

---

## ก่อนเริ่มใช้งาน

ตรวจสอบให้แน่ใจว่า:

- [ ] คุณเข้าสู่ระบบ Admin Portal ด้วยบทบาท Admin หรือ Warehouse Staff (ดูบท [00 — เริ่มต้นใช้งาน](00-getting-started.md))
- [ ] มีคลังสินค้า (Warehouse) อย่างน้อย 1 แห่งถูกสร้างไว้แล้ว (Spare Parts → คลังสินค้า)
- [ ] รายการอะไหล่ในแคตตาล็อก (Spare Part Catalog) ถูกตั้งค่าไว้แล้ว
- [ ] บัญชีช่างเทคนิคใช้งานได้และเปิดสิทธิ์เข้าถึงอะไหล่แล้ว
- [ ] คุณเข้าใจประเภทอะไหล่ 2 แบบ: **CONSUMABLE** (ใช้แล้วหมด ไม่คืน) และ **STOCKABLE** (นำกลับมาใช้ซ้ำได้ คืนเข้าคลังได้)
- [ ] คุณเข้าใจสิทธิ์: การ **ดู (VIEW)** เพียงพอสำหรับดูสต็อก/การใช้/ประวัติ ส่วนการสร้าง/อนุมัติ/โอน/คืน ต้องมีสิทธิ์ **แก้ไข (EDIT)** และการลบอะไหล่ต้องมีสิทธิ์ **ลบ (DELETE)**

### ตารางอ้างอิงสำคัญ

**ประเภทอะไหล่ (Part Type)**

| ประเภท | คำอธิบาย | คืนเข้าคลังหรือไม่ |
|--------|----------|:------------------:|
| **CONSUMABLE** | อะไหล่ใช้ครั้งเดียวแล้วหมดระหว่างให้บริการ (ไส้กรอง, ซีล, น้ำมันหล่อลื่น) | ไม่คืน |
| **STOCKABLE** | อะไหล่ที่นำกลับมาใช้ซ้ำได้ คืนเข้าคลังหลังใช้งาน (เครื่องมือ, โมดูล, ชุดประกอบ) | คืนได้ |

**ป้ายสถานะสต็อก (Stock Status Badge)**

| สถานะ | สีป้าย | ความหมาย |
|-------|:------:|----------|
| AVAILABLE — มีสต็อก | เขียว | สต็อกสูงกว่าระดับต่ำสุดที่กำหนด |
| LOW_STOCK — สต็อกต่ำ | เหลือง | สต็อกเท่ากับหรือต่ำกว่าระดับต่ำสุด — ต้องดำเนินการ |
| OUT_OF_STOCK — หมดสต็อก | เทา | ไม่มีสต็อกเหลือในคลัง (ศูนย์ชิ้น) |

---

## สถานการณ์: ดูสต็อกอะไหล่ในคลัง

### สิ่งที่คุณต้องการทำ

ดูรายการอะไหล่ทั้งหมดพร้อมระดับสต็อกในแต่ละคลัง และค้นหาอะไหล่ที่ต้องดำเนินการได้รวดเร็ว

### ขั้นตอน

1. คลิก **Spare Parts (อะไหล่) → สต็อกอะไหล่ (Stock)** ในเมนูด้านซ้าย ระบบจะโหลดรายการสต็อกเป็นหน้าเริ่มต้น

   ![รายการสต็อกอะไหล่แสดงป้ายสถานะ](images/06-stock-list-overview.png)

   <!-- 📸 NEED SCREENSHOT: รายการสต็อกอะไหล่แสดงหลายรายการพร้อมป้ายสถานะ เขียว/เหลือง/เทา -->

2. อ่านข้อมูลในแต่ละแถวของตารางสต็อก:

   | คอลัมน์ | ความหมาย | ตัวอย่าง |
   |---------|----------|----------|
   | รหัสอะไหล่ (Part Number) | รหัส SKU เฉพาะของอะไหล่ | SP-BELT-001 |
   | ชื่ออะไหล่ (Part Name) | ชื่อแสดงของอะไหล่ | สายพานคอมเพรสเซอร์ |
   | หมวดหมู่ (Category) | หมวดหมู่ของอะไหล่ | สายพาน |
   | หน่วยนับ (Unit) | หน่วยวัด | ชิ้น |
   | ราคาต่อหน่วย (Unit Cost) | ราคาทุนต่อหน่วย (ใช้ภายใน) | 350 |
   | ประเภท (Type) | ป้าย CONSUMABLE หรือ STOCKABLE | STOCKABLE |
   | จำนวนสต็อกต่อคลัง | จำนวนคงเหลือแยกตามคลัง | WH-BKK: 45, WH-CM: 12 |
   | สถานะ (Status) | ป้ายสีบอกระดับสต็อก | เขียว (มีสต็อก) |

3. ใช้แถบค้นหาและตัวกรองเพื่อจำกัดผลลัพธ์:

   | ตัวกรอง | ชนิด | ใช้ทำอะไร |
   |---------|------|-----------|
   | ค้นหา (Search) | ช่องข้อความ | ค้นหาด้วยชื่ออะไหล่หรือรหัสอะไหล่ |
   | ประเภท (Type) | Dropdown | กรองเฉพาะ CONSUMABLE หรือ STOCKABLE |
   | คลังสินค้า (Warehouse) | Dropdown | แสดงสต็อกเฉพาะคลังที่เลือก |
   | สถานะ (Status) | Dropdown | กรองตาม AVAILABLE / LOW_STOCK / OUT_OF_STOCK |

4. คลิกแถวใดก็ได้เพื่อเปิดหน้ารายละเอียดอะไหล่ พร้อมประวัติสต็อกและรายละเอียดแยกตามคลัง

### ผลลัพธ์ที่จะเกิดขึ้น

รายการสต็อกแสดงจำนวนแบบเรียลไทม์ อะไหล่ที่สถานะ LOW_STOCK จะมีป้ายสีเหลืองให้สังเกตง่าย ใช้ตัวกรองสถานะค้นหาอะไหล่ที่ต้องเติมสต็อกได้ทันที

> **เคล็ดลับ:** เริ่มต้นวันด้วยการกรองสถานะ LOW_STOCK และ OUT_OF_STOCK จะเห็นภาพรวมอะไหล่ที่ต้องจัดซื้อหรือโยกระหว่างคลังทันที

---

## สถานการณ์: สร้างและแก้ไขรายการอะไหล่

### สิ่งที่คุณต้องการทำ

ลงทะเบียนอะไหล่ใหม่ในระบบเพื่อให้ติดตาม เบิก โอน และผูกกับคลังได้ หรือแก้ไขข้อมูลอะไหล่ที่มีอยู่

### ขั้นตอน

1. ที่หน้ารายการสต็อก คลิกปุ่ม **+ สร้างอะไหล่ (Create)** ที่มุมขวาบน

   <!-- 📸 NEED SCREENSHOT: ปุ่ม "+ สร้างอะไหล่" ถูกไฮไลต์ที่มุมขวาบนของหน้ารายการสต็อก -->

2. กรอกข้อมูลในฟอร์มสร้างอะไหล่:

   | ช่อง | กรอกอะไร | เงื่อนไข |
   |------|----------|----------|
   | รหัสอะไหล่ (Part Number)* | รหัส SKU เฉพาะ เช่น SP-BELT-001 | ต้องไม่ซ้ำกับอะไหล่อื่นในระบบ |
   | ชื่ออะไหล่ (Part Name)* | ชื่อ/คำอธิบายของอะไหล่ | ความยาวไม่เกิน 200 ตัวอักษร |
   | หมวดหมู่ (Category) | หมวดหมู่ของอะไหล่ | ไม่บังคับ |
   | หน่วยนับ (Unit)* | หน่วยวัด เช่น ชิ้น, ลิตร, ชุด | ต้องระบุ |
   | ราคาต่อหน่วย (Unit Cost) | ราคาทุนต่อหน่วย (ใช้ติดตามภายใน ไม่ใช่คิดเงินลูกค้า) | ต้องมากกว่าหรือเท่ากับ 0 |
   | ประเภท (Type)* | เลือก CONSUMABLE หรือ STOCKABLE | ต้องเลือก 1 อย่าง |
   | อายุการใช้งาน (Age — ปี) | อายุการใช้งานสำหรับติดตามการบำรุงรักษา | ไม่บังคับ ระบุเป็นจำนวนปี |
   | ระดับสต็อกต่ำสุด (Minimum Stock) | เกณฑ์ที่ต่ำกว่านี้จะแจ้งเตือน LOW_STOCK | ต้องมากกว่าหรือเท่ากับ 0 |
   | คลังสินค้า & จำนวนเริ่มต้น | เลือกคลังและกรอกจำนวนสต็อกเริ่มต้น | จำนวนต้องมากกว่าหรือเท่ากับ 0 |

   > **หมายเหตุ:** ช่องที่มีเครื่องหมาย * เป็นช่องที่ต้องกรอก

   <!-- 📸 NEED SCREENSHOT: ฟอร์มสร้างอะไหล่แสดงทุกช่องและส่วนเลือกคลังสินค้า -->

   > **หมายเหตุ:** เลือกประเภทให้รอบคอบ — อะไหล่ CONSUMABLE คาดว่าจะใช้แล้วหมด ไม่คืน ส่วน STOCKABLE คืนเข้าคลังได้หลังใช้งาน สิ่งนี้มีผลต่อขั้นตอนการคืนอะไหล่

3. คลิก **บันทึก (Save)** เพื่อสร้างอะไหล่

   > **คำเตือน:** หากกรอกข้อมูลไม่ครบหรือผิดเงื่อนไข ระบบจะแสดง error และไฮไลต์ช่องที่ต้องแก้ ให้แก้ไขช่องที่ไฮไลต์แล้วบันทึกอีกครั้ง

4. หากต้องการแก้ไขอะไหล่ที่มีอยู่ ที่หน้ารายการสต็อก คลิกเมนูการกระทำ **(⋮)** ที่แถวของอะไหล่ แล้วเลือก **แก้ไข (Edit)**

5. ในหน้าแก้ไข แก้ข้อมูลทั่วไป จัดการจำนวนสต็อกแยกตามคลัง หรือเปิดแท็บ **ประวัติ (History)** เพื่อดูประวัติสต็อก แล้วคลิก **บันทึก (Save)**

### ผลลัพธ์ที่จะเกิดขึ้น

อะไหล่ใหม่ถูกเพิ่มเข้าแคตตาล็อกและพร้อมใช้สำหรับการเบิกและโอนทันที ระบบจะเริ่มติดตามทุกการเพิ่ม/ลดสต็อก (จากการเบิก โอน คืน) และอัปเดตป้ายสถานะอัตโนมัติตามเกณฑ์สต็อกต่ำสุดที่ตั้งไว้

> **คำเตือน:** รหัสอะไหล่ (Part Number) ต้องไม่ซ้ำ หากกรอกรหัสที่มีอยู่แล้ว ระบบจะไม่ยอมให้สร้าง ให้ใช้รูปแบบตั้งชื่อที่สม่ำเสมอ เช่น `SP-{หมวด}-{เลขลำดับ}`

---

## สถานการณ์: ตั้งค่าสต็อกต่อคลังสินค้า

### สิ่งที่คุณต้องการทำ

กำหนดจำนวนสต็อกเริ่มต้นของอะไหล่ในแต่ละคลัง เพื่อให้ระบบติดตามจำนวนคงคลังได้แม่นยำ

### ขั้นตอน

1. เปิดอะไหล่โดยคลิกแถวของอะไหล่ในรายการสต็อก แล้วเข้าหน้าแก้ไข

2. ไปที่ส่วน/แท็บ **คลังสินค้า (Warehouse)** ในหน้ารายละเอียดอะไหล่

   <!-- 📸 NEED SCREENSHOT: หน้ารายละเอียดอะไหล่ แท็บคลังสินค้า แสดงรายการสต็อกแยกตามคลัง -->

3. คลิก **+ เพิ่มคลังสินค้า (Add Warehouse)** หรือเลือกคลังที่มีอยู่เพื่อแก้ไข

4. กรอกจำนวนสต็อกสำหรับคลังที่เลือก:

   | ช่อง | กรอกอะไร | เงื่อนไข |
   |------|----------|----------|
   | คลังสินค้า (Warehouse)* | เลือกจากรายการคลังที่ตั้งค่าไว้ | ต้องเป็นคลังที่มีอยู่จริง |
   | จำนวนเริ่มต้น (Initial Quantity)* | จำนวนสต็อกตั้งต้นของคลังนี้ | ต้องมากกว่าหรือเท่ากับ 0 |

   > **หมายเหตุ:** ช่องที่มีเครื่องหมาย * เป็นช่องที่ต้องกรอก

5. คลิก **บันทึก (Save)** ระบบบันทึกระดับสต็อกและเริ่มบันทึกประวัติสต็อก (Audit Trail)

6. ทำซ้ำขั้นตอน 3–5 สำหรับทุกคลังที่เก็บอะไหล่ชิ้นนี้

### ผลลัพธ์ที่จะเกิดขึ้น

อะไหล่จะแสดงระดับสต็อกแยกตามคลัง ระบบเริ่มติดตามทุกการเพิ่ม/ลด (จากการเบิก โอน คืน) เทียบกับจำนวนนี้ และป้ายสถานะจะอัปเดตอัตโนมัติตามเกณฑ์สต็อกต่ำสุด

> **เคล็ดลับ:** ก่อนตั้งค่าสต็อก ให้นับจำนวนจริงทางกายภาพก่อน ตัวเลขตั้งต้นที่ถูกต้องสำคัญต่อการแจ้งเตือนสต็อกต่ำที่เชื่อถือได้

---

## สถานการณ์: จัดการคลังสินค้า (Warehouse)

### สิ่งที่คุณต้องการทำ

สร้าง แก้ไข หรือปิดใช้งานคลังสินค้าที่เก็บอะไหล่ตามสถานที่ต่าง ๆ

### ขั้นตอน

1. คลิก **Spare Parts (อะไหล่) → คลังสินค้า (Warehouse)** ในเมนูด้านซ้าย

   ![รายการคลังสินค้า](images/06-warehouse-list.png)

   <!-- 📸 NEED SCREENSHOT: หน้ารายการคลังสินค้าแสดงหลายคลัง -->

2. รายการคลังสินค้าจะแสดงคลังทั้งหมดที่ตั้งค่าไว้ พร้อมชื่อคลัง ที่อยู่ จำนวนชนิดอะไหล่ที่จัดเก็บ และสถานะ (ใช้งาน/ปิดใช้งาน)

3. หากต้องการเพิ่มคลังใหม่ คลิก **+ สร้างคลังสินค้า (Create)** แล้วกรอก:

   | ช่อง | กรอกอะไร | เงื่อนไข |
   |------|----------|----------|
   | ชื่อคลังสินค้า (Warehouse Name)* | ชื่อที่ระบุได้ชัดเจน เช่น WH-Bangkok-Central | ความยาวไม่เกิน 100 ตัวอักษร |
   | ที่อยู่ (Address) | ที่อยู่ทางกายภาพของคลัง | ไม่บังคับ |
   | สถานะ (Status) | สลับ ใช้งาน (Active) / ปิดใช้งาน (Inactive) | ค่าเริ่มต้นคือ ใช้งาน |

   > **หมายเหตุ:** ช่องที่มีเครื่องหมาย * เป็นช่องที่ต้องกรอก

   <!-- 📸 NEED SCREENSHOT: ฟอร์มสร้างคลังสินค้า -->

4. คลิก **บันทึก (Save)** เพื่อสร้างคลัง ระบบจะพากลับไปหน้ารายการ

5. หากต้องการแก้ไขคลังที่มีอยู่ คลิกแถวนั้นแล้วแก้ไขข้อมูล หากต้องการปิดใช้งาน ให้สลับสถานะเป็น **ปิดใช้งาน (Inactive)**

### ผลลัพธ์ที่จะเกิดขึ้น

คลังใหม่พร้อมใช้ตั้งค่าสต็อกได้ทันที แต่ละคลังติดตามระดับสต็อกอิสระต่อกัน คลังที่ปิดใช้งานจะไม่รับสต็อกใหม่แต่ยังเก็บข้อมูลย้อนหลังไว้

> **คำเตือน:** การปิดใช้งานคลังไม่ได้โอนสต็อกออกให้อัตโนมัติ ให้โอนหรือกระทบยอดสต็อกให้เรียบร้อยก่อนปิดใช้งานคลัง

---

## สถานการณ์: อนุมัติหรือปฏิเสธคำขอเบิกอะไหล่ (Requisition)

### สิ่งที่คุณต้องการทำ

ตรวจสอบคำขอเบิกอะไหล่จากช่าง แล้วอนุมัติ (ตัดสต็อกออกจากคลัง) หรือปฏิเสธพร้อมระบุเหตุผล

### ขั้นตอน

1. คลิก **Spare Parts (อะไหล่) → คำขอเบิกอะไหล่ (Requisitions)** ในเมนูด้านซ้าย ระบบจะโหลดรายการคำขอ

   ![รายการคำขอเบิกอะไหล่ที่รอดำเนินการ](images/06-requisitions-pending.png)

   <!-- 📸 NEED SCREENSHOT: รายการคำขอเบิกพร้อมแท็บกรอง ทั้งหมด/รอดำเนินการ/อนุมัติแล้ว/ปฏิเสธ -->

2. ใช้แท็บกรองด้านบนเพื่อเลือกชุดคำขอ: **ทั้งหมด (All)**, **รอดำเนินการ (Pending)**, **อนุมัติแล้ว (Approved)**, **ปฏิเสธ (Rejected)**

3. อ่านข้อมูลในแต่ละแถวของคำขอที่รอดำเนินการ:

   | คอลัมน์ | ความหมาย | ตัวอย่าง |
   |---------|----------|----------|
   | รหัสรายการ (Transaction Code) | รหัสเฉพาะที่ระบบสร้างอัตโนมัติ | REQ-20260115-001 |
   | ช่างผู้ขอ (Technician) | ชื่อช่างที่ส่งคำขอ | สมชาย พ. |
   | อะไหล่ (Spare Part) | ชื่อและรหัสอะไหล่ | สายพานคอมเพรสเซอร์ (SP-BELT-001) |
   | จำนวน (Quantity) | จำนวนที่ขอเบิก | 3 |
   | ใบงาน (Work Order) | เลขที่ใบงานที่เกี่ยวข้อง | BM2026011500012 |
   | รูปภาพ (Photo) | ภาพประกอบที่แนบมา | (รูปย่อ) |
   | วันที่ (Date) | วันเวลาที่ส่งคำขอ | 2026-01-15 09:30 |

4. คลิกคำขอเพื่อเปิดหน้ารายละเอียด ตรวจสอบข้อมูลทั้งหมดรวมถึงรูปภาพที่แนบมา

   <!-- 📸 NEED SCREENSHOT: หน้ารายละเอียดคำขอเบิกแสดงทุกช่อง รูปภาพ และปุ่มอนุมัติ/ไม่อนุมัติ -->

5. เลือกการกระทำ:

   **เพื่ออนุมัติ:**

   | ขั้น | การกระทำ |
   |------|----------|
   | 1 | ตรวจสอบว่าอะไหล่และจำนวนสมเหตุสมผลกับใบงานที่อ้างถึง |
   | 2 | ยืนยันว่าคลังมีสต็อกเพียงพอ |
   | 3 | คลิก **อนุมัติ (Approve)** |

   **เพื่อปฏิเสธ:**

   | ขั้น | การกระทำ |
   |------|----------|
   | 1 | คลิก **ไม่อนุมัติ (Reject)** |
   | 2 | เลือกเหตุผลการปฏิเสธจาก dropdown (เลือกได้มากกว่าหนึ่งเหตุผล) เช่น สต็อกไม่เพียงพอ, คำขอไม่ถูกต้อง, เอกสารไม่ครบ |
   | 3 | กรอกหมายเหตุการปฏิเสธ (Reject Note) เพิ่มเติม |
   | 4 | คลิก **ยืนยันการปฏิเสธ (Confirm)** |

   <!-- 📸 NEED SCREENSHOT: Modal ปฏิเสธคำขอแสดง dropdown เหตุผลและช่องหมายเหตุ -->

   > **หมายเหตุ:** การปฏิเสธทุกครั้งต้องระบุเหตุผล (Business Rule BR2) — ระบบจะไม่ให้ยืนยันการปฏิเสธหากไม่เลือกเหตุผล

### ผลลัพธ์ที่จะเกิดขึ้น

- **อนุมัติแล้ว:** สต็อกในคลังลดลงตามจำนวนที่ขอ และเพิ่มเข้าคลังในมือของช่าง ช่างได้รับการแจ้งเตือนยืนยันการอนุมัติ
- **ปฏิเสธ:** ไม่มีการเปลี่ยนแปลงสต็อก ช่างได้รับการแจ้งเตือนพร้อมเหตุผลและหมายเหตุ การปฏิเสธถูกบันทึกใน Audit Trail

> **คำเตือน:** การอนุมัติจะตรวจสอบกับสต็อกที่มีอยู่ (BR3) หากสต็อกไม่พอ ระบบจะไม่ยอมให้อนุมัติ — ต้องเติมสต็อกหรือปฏิเสธพร้อมเหตุผล "สต็อกไม่เพียงพอ"

---

## สถานการณ์: จัดการการโอนย้ายอะไหล่ (Transfer)

### สิ่งที่คุณต้องการทำ

สร้างหรือตรวจสอบรายการโอนย้ายอะไหล่ระหว่างคลังกับคลัง หรือระหว่างคลังกับช่าง

### ขั้นตอน

1. คลิก **Spare Parts (อะไหล่) → โอนย้ายอะไหล่ (Transfers)** ในเมนูด้านซ้าย

   ![รายการโอนย้ายอะไหล่](images/06-transfers-list.png)

   <!-- 📸 NEED SCREENSHOT: รายการโอนย้ายอะไหล่แสดงผู้ส่ง/ผู้รับ/อะไหล่/จำนวน -->

2. คลิกรายการโอนย้ายเพื่อดูรายละเอียด หรือคลิก **+ สร้างรายการโอนย้าย (Create)** เพื่อสร้างใหม่

3. ในฟอร์มโอนย้าย กรอกข้อมูล:

   | ช่อง | กรอกอะไร | เงื่อนไข |
   |------|----------|----------|
   | ต้นทาง (From)* | เลือก คลังสินค้า (STORE) หรือ ช่าง (TECHNICIAN) | ต้องเลือก |
   | ปลายทาง (To)* | เลือก คลังสินค้า (STORE) หรือ ช่าง (TECHNICIAN) | ต้องเลือก |
   | รายการอะไหล่ (Spare Part)* | เลือกอะไหล่ที่จะโอน | ต้องเลือกอย่างน้อย 1 รายการ |
   | จำนวน (Quantity)* | จำนวนที่โอน | ต้องไม่เกินสต็อกที่ต้นทางมี |

   > **หมายเหตุ:** ช่องที่มีเครื่องหมาย * เป็นช่องที่ต้องกรอก

4. ทำความเข้าใจประเภทการโอนย้าย:

   | ต้นทาง | ปลายทาง | คำอธิบาย |
   |--------|---------|----------|
   | คลังสินค้า | คลังสินค้า | โอนระหว่างคลัง |
   | คลังสินค้า | ช่าง | โอนจากคลังไปช่าง |
   | ช่าง | คลังสินค้า | โอนจากช่างกลับคลัง |
   | ช่าง | ช่าง | โอนระหว่างช่าง |

5. คลิก **บันทึก (Save)** เพื่อสร้างรายการโอนย้าย

### ผลลัพธ์ที่จะเกิดขึ้น

ระบบปรับสต็อกระหว่างต้นทางและปลายทางทันที สต็อกของผู้ส่งลดลง สต็อกของผู้รับเพิ่มขึ้น และบันทึกในประวัติสต็อก (Audit Trail) ของทั้งสองฝ่าย

> **คำเตือน:** หากสต็อกต้นทางไม่เพียงพอ ระบบจะแสดง error "สต็อกไม่เพียงพอ" ให้ปรับลดจำนวนหรือเลือกต้นทางอื่นที่มีสต็อกพอ (BR3 — Stock Validation)

---

## สถานการณ์: ดำเนินการคืนอะไหล่ (Return)

### สิ่งที่คุณต้องการทำ

รับและตรวจสอบอะไหล่ที่ช่างส่งคืน แล้วอนุมัติเพื่อนำกลับเข้าคลัง หรือปฏิเสธหากอะไหล่เสียหายหรือไม่ถูกต้อง

### ขั้นตอน

1. คลิก **Spare Parts (อะไหล่) → คืนอะไหล่ (Returns)** ในเมนูด้านซ้าย

   ![รายการคืนอะไหล่ที่รอดำเนินการ](images/06-returns-pending.png)

   <!-- 📸 NEED SCREENSHOT: รายการคืนอะไหล่แสดงข้อมูลสภาพอะไหล่ -->

2. อ่านข้อมูลในแต่ละแถวของรายการคืน: รหัสรายการ, ช่างผู้คืน, อะไหล่ (ชื่อ/รหัส/ประเภท), จำนวน, คลังปลายทาง, รูปภาพสภาพอะไหล่, วันที่

3. คลิกรายการคืนเพื่อเปิดหน้ารายละเอียด ตรวจสอบรูปภาพและยืนยันว่าอะไหล่ตรงกับคำอธิบาย

   <!-- 📸 NEED SCREENSHOT: หน้ารายละเอียดการคืน แสดงรูปภาพและส่วนตรวจสอบสภาพ -->

4. ตรวจสอบสภาพอะไหล่ (Condition): **ดี (Good)** / **เสียหาย (Damaged)** / **ชำรุด (Defective)** แล้วเลือกการกระทำ:

   **เพื่ออนุมัติ (รับคืนเข้าคลัง):**

   | ขั้น | การกระทำ |
   |------|----------|
   | 1 | ตรวจสอบว่าอะไหล่ตรงกับคำอธิบายและรูปภาพจริง |
   | 2 | ยืนยันว่าสภาพอะไหล่ใช้งานได้ พร้อมนำกลับเข้าคลัง |
   | 3 | คลิก **รับคืน (Approve)** |

   **เพื่อปฏิเสธ:**

   | ขั้น | การกระทำ |
   |------|----------|
   | 1 | คลิก **ปฏิเสธ (Reject)** |
   | 2 | เลือกเหตุผลการปฏิเสธจาก dropdown เช่น อะไหล่เสียหาย, อะไหล่ผิดชนิด, จำนวนไม่ตรง |
   | 3 | กรอกหมายเหตุอธิบายปัญหา (ไม่บังคับ) |
   | 4 | คลิก **ยืนยันการปฏิเสธ (Confirm)** |

5. หากต้องการดูประวัติการคืนของอะไหล่ คลิก **ดูประวัติ (View History)** Modal ประวัติการคืนจะเปิดขึ้น

   <!-- 📸 NEED SCREENSHOT: Modal ประวัติการคืนอะไหล่พร้อมรูปภาพหลักฐาน -->

### ผลลัพธ์ที่จะเกิดขึ้น

- **อนุมัติ:** อะไหล่ถูกเพิ่มกลับเข้าสต็อกคลังปลายทาง (สต็อกในมือช่างถูกตัดไปแล้วตอนเริ่มคืน) ช่างได้รับการแจ้งเตือนยืนยันการรับคืน
- **ปฏิเสธ:** อะไหล่ถูกเพิ่มกลับเข้าคลังในมือของช่าง ช่างได้รับการแจ้งเตือนพร้อมเหตุผล และต้องประสานกับคลังเพื่อแก้ไข

> **คำเตือน:** อนุมัติการคืนหลังตรวจสอบอะไหล่จริงทางกายภาพแล้วเท่านั้น (BR4 — Return Inspection) การรับอะไหล่เสียหายเข้าคลังจะสร้างปัญหาคุณภาพสต็อกในภายหลัง

---

## สถานการณ์: ดูประวัติการใช้อะไหล่ต่อใบงาน

### สิ่งที่คุณต้องการทำ

ดูว่าอะไหล่ใดถูกใช้ในใบงานใด โดยช่างคนใด และจำนวนเท่าใด เพื่อติดตามต้นทุนและตรวจสอบย้อนหลัง

### ขั้นตอน

1. คลิก **Spare Parts (อะไหล่) → การใช้อะไหล่ (Usage)** ในเมนูด้านซ้าย

   ![รายการการใช้อะไหล่](images/06-usage-list.png)

   <!-- 📸 NEED SCREENSHOT: รายการการใช้อะไหล่แสดงใบงาน-อะไหล่-ช่าง -->

2. อ่านข้อมูลในรายการการใช้:

   | คอลัมน์ | ความหมาย | ตัวอย่าง |
   |---------|----------|----------|
   | เลขที่ใบงาน (Job Number) | ใบงานที่ใช้อะไหล่ | BM2026011500012 |
   | ช่าง (Technician) | ช่างที่ใช้อะไหล่ | สมชาย พ. |
   | อะไหล่ (Spare Part) | ชื่อและรหัสอะไหล่ | สายพานคอมเพรสเซอร์ (SP-BELT-001) |
   | จำนวนที่ใช้ (Quantity Used) | จำนวนที่ถูกใช้ | 2 |
   | ประเภทงาน (Job Type) | ประเภทของใบงาน | บำรุงรักษา (PM) |
   | วันที่ (Date) | วันเวลาที่บันทึกการใช้ | 2026-01-15 14:30 |

3. ใช้ตัวกรองเพื่อจำกัดผลลัพธ์: ช่วงวันที่ (Date Range), ช่าง (Technician), เลขที่ใบงาน (Job Number)

4. คลิกรายการใดก็ได้เพื่อดูรายละเอียดใบงานที่เกี่ยวข้อง

### ผลลัพธ์ที่จะเกิดขึ้น

ข้อมูลการใช้เป็นแบบอ่านอย่างเดียว สะท้อนอะไหล่ที่ถูกใช้จริงในงาน (สร้างอัตโนมัติเมื่อช่างทำเครื่องหมายใช้อะไหล่บนใบงาน — BR7) ใช้ข้อมูลนี้วิเคราะห์ต้นทุน วางแผนจัดซื้อ และดูว่าอะไหล่ใดถูกใช้บ่อยที่สุด

> **เคล็ดลับ:** ส่งออกข้อมูลการใช้ทุกเดือนเพื่อพยากรณ์การจัดซื้อ อะไหล่ที่ใช้บ่อยอาจต้องตั้งระดับสต็อกต่ำสุดให้สูงขึ้น

---

## สถานการณ์: นำเข้าและส่งออกข้อมูลสต็อก (Import / Export)

### สิ่งที่คุณต้องการทำ

นำเข้าอะไหล่และจำนวนสต็อกจำนวนมากจากไฟล์ CSV หรือส่งออกระดับสต็อกปัจจุบันเพื่อทำรายงาน

### ขั้นตอน

**เพื่อส่งออก (Export):**

1. ที่หน้ารายการสต็อก คลิกปุ่ม **ดาวน์โหลด (Export)**

   <!-- 📸 NEED SCREENSHOT: ปุ่มส่งออกและกล่องโต้ตอบดาวน์โหลด CSV -->

2. ไฟล์ CSV จะดาวน์โหลดลงอุปกรณ์ พร้อมคอลัมน์ชื่ออะไหล่ รหัส ประเภท และจำนวนสต็อกต่อคลัง

**เพื่อนำเข้า (Import):**

1. ที่หน้ารายการสต็อก คลิกปุ่ม **นำเข้า (Import)** Modal นำเข้าจะเปิดขึ้น

2. ดาวน์โหลด **เทมเพลต CSV** หากนำเข้าครั้งแรก (เทมเพลตมีหัวคอลัมน์ที่จำเป็น)

   | คอลัมน์ | จำเป็น | คำอธิบาย |
   |---------|:------:|----------|
   | Part Number | ใช่ | รหัสอะไหล่เฉพาะ |
   | Part Name | ใช่ | ชื่ออะไหล่ |
   | Type | ใช่ | CONSUMABLE หรือ STOCKABLE |
   | Minimum Stock | ใช่ | เกณฑ์สต็อกต่ำ |
   | Description | ไม่ | คำอธิบายอะไหล่ |
   | {ชื่อคลังสินค้า} | ไม่ | หนึ่งคอลัมน์ต่อหนึ่งคลัง พร้อมค่าจำนวน |

   <!-- 📸 NEED SCREENSHOT: Modal นำเข้า CSV พร้อมลิงก์ดาวน์โหลดเทมเพลตและช่องอัปโหลดไฟล์ -->

3. กรอกข้อมูลใน CSV สำหรับหลายคลัง ให้เพิ่มหนึ่งคอลัมน์ต่อคลัง โดยใช้ชื่อคลังเป็นหัวคอลัมน์

4. อัปโหลดไฟล์ CSV แล้วคลิก **นำเข้า (Import)**

5. ระบบตรวจสอบไฟล์ หากมีแถวที่ผิดพลาด ระบบจะแสดงว่าแถวใดล้มเหลว

### ผลลัพธ์ที่จะเกิดขึ้น

อะไหล่ที่นำเข้าถูกเพิ่มเข้าแคตตาล็อกและตั้งค่าสต็อกต่อคลัง อะไหล่ที่มีอยู่แล้ว (จับคู่ด้วย Part Number) จะอัปเดตระดับสต็อก การนำเข้าถูกบันทึกใน Audit Trail

> **คำเตือน:** ใช้เทมเพลตล่าสุดเสมอ หัวคอลัมน์ต้องตรงทุกตัวอักษร การนำเข้าด้วยหัวคอลัมน์ผิดจะทำให้เกิด error การตรวจสอบ

---

## สถานการณ์: ดูประวัติสต็อกและเฝ้าระวังสต็อกต่ำ

### สิ่งที่คุณต้องการทำ

ตรวจสอบประวัติการเคลื่อนไหวสต็อกของอะไหล่ และระบุอะไหล่ที่ต่ำกว่าระดับต่ำสุดเพื่อดำเนินการ

### ขั้นตอน

1. เปิดหน้าแก้ไขอะไหล่ แล้วคลิกแท็บ **ประวัติ (History)** ไทม์ไลน์ประวัติสต็อกจะโหลดขึ้น

   <!-- 📸 NEED SCREENSHOT: แท็บประวัติสต็อกแสดงไทม์ไลน์การเคลื่อนไหว (ตั้งต้น/โอนออก/อนุมัติคำขอ) -->

2. แต่ละรายการในไทม์ไลน์แสดงวันเวลา ประเภทการเคลื่อนไหว จำนวนที่เปลี่ยน และคลัง/อ้างอิงที่เกี่ยวข้อง เช่น:

   | ตัวอย่างรายการ | คำอธิบาย |
   |----------------|----------|
   | 2026-04-01 10:00 — ตั้งต้นสต็อก +100 (คลัง Main) | บันทึกสต็อกเริ่มต้น |
   | 2026-04-01 14:00 — โอนออก -5 (ไปยัง ช่าง A) | การโอนย้าย |
   | 2026-04-02 09:00 — อนุมัติคำขอเบิก -3 (ใบงาน BM202604020001) | การเบิกที่อนุมัติ |

3. ที่หน้ารายการสต็อก อะไหล่ที่สถานะ LOW_STOCK จะถูกไฮไลต์ป้าย **สีเหลือง** ใช้ตัวกรองสถานะ **LOW_STOCK** เพื่อดูเฉพาะอะไหล่ที่ต้องดำเนินการ

   <!-- 📸 NEED SCREENSHOT: รายการสต็อกกรองด้วย LOW_STOCK แสดงป้ายสีเหลือง -->

4. หน้า **Dashboard** (หน้าหลัก) แสดงการ์ดสรุปจำนวนอะไหล่ที่ต่ำกว่าเกณฑ์ คลิกการ์ดเพื่อไปยังรายการสต็อกที่กรองเฉพาะ LOW_STOCK

5. สำหรับอะไหล่สต็อกต่ำแต่ละชิ้น ดำเนินการ: สั่งซื้อจากผู้ขาย, โอนสต็อกระหว่างคลัง หรือปรับเกณฑ์สต็อกต่ำสุดให้เหมาะสม

### ผลลัพธ์ที่จะเกิดขึ้น

ประวัติสต็อกให้ร่องรอยตรวจสอบย้อนหลังครบถ้วน การแจ้งเตือนสต็อกต่ำจะคงอยู่จนกว่าสต็อกถูกเติมสูงกว่าเกณฑ์ สถานะจะอัปเดตจาก LOW_STOCK เป็น AVAILABLE อัตโนมัติเมื่อเพิ่มสต็อก (จากการนำเข้า, อนุมัติการคืน หรือปรับด้วยมือ)

> **เคล็ดลับ:** ทบทวนเกณฑ์สต็อกต่ำสุดทุกไตรมาส อะไหล่ที่มีรูปแบบความต้องการตามฤดูกาลอาจต้องใช้เกณฑ์ต่างกันในแต่ละช่วง

---

## เมื่อเกิดปัญหา

| สิ่งที่คุณเห็น | ทำอย่างไร |
|---------------|-----------|
| จำนวนสต็อกไม่ตรงกับของจริง | 1. นับจำนวนจริง 2. ใช้ฟังก์ชันนำเข้า (Import) แก้จำนวน 3. ตรวจประวัติสต็อก (History) เพื่อหาจุดที่คลาดเคลื่อน |
| อนุมัติคำขอเบิกไม่ได้ "สต็อกไม่เพียงพอ" | คลังมีสต็อกไม่พอ — ปฏิเสธพร้อมเหตุผล "สต็อกไม่เพียงพอ" หรือเติมสต็อกก่อนด้วยการนำเข้า/โอนจากคลังอื่น |
| นำเข้า CSV ล้มเหลวด้วย error การตรวจสอบ | ดาวน์โหลดเทมเพลตล่าสุด ตรวจหัวคอลัมน์ให้ตรงทุกตัวอักษร ตรวจว่า Part Number ไม่ซ้ำ และ Type เป็น CONSUMABLE หรือ STOCKABLE (case-sensitive) |
| ไม่มีการแจ้งเตือนสต็อกต่ำสำหรับอะไหล่ | ตรวจว่าระดับสต็อกต่ำสุดตั้งถูกต้อง ค่า 0 หมายความว่าไม่มีการแจ้งเตือน — แก้ไขอะไหล่แล้วตั้งเกณฑ์ที่เหมาะสม |
| รายการโอนย้ายค้างสถานะ Pending | การโอนย้ายต้องผ่านการอนุมัติ Admin ไปที่ Spare Parts → โอนย้ายอะไหล่ แล้วดำเนินการ หากดำเนินการแล้ว ตรวจ Audit Trail เพื่อดูผลลัพธ์ |
| การคืนถูกปฏิเสธแต่ช่างยืนยันว่าอะไหล่ปกติ | ประสานกับเจ้าหน้าที่คลังที่ตรวจสอบ ทบทวนเหตุผลและรูปภาพ หากเป็นความผิดพลาด ให้ช่างส่งคำขอคืนใหม่ |
| error รหัสอะไหล่ซ้ำตอนสร้าง | มีอะไหล่ที่ใช้รหัสนั้นอยู่แล้ว ค้นหาในรายการสต็อก หากต้องการอะไหล่ใหม่ ให้ใช้รหัสอื่น |
| ลบ/ปิดใช้งานคลังสินค้าไม่ได้ | คลังยังมีสต็อกค้างอยู่ ให้โอนหรือเคลียร์สต็อกเป็นศูนย์ก่อนปิดใช้งานคลัง |
| "ไม่มีสิทธิ์เข้าถึง" หรือ error 403 | บทบาทของคุณไม่มีสิทธิ์ EDIT/DELETE ในโมดูลนี้ ติดต่อ SuperAdmin เพื่อตรวจสอบบทบาท (ดูบท [00 — เริ่มต้นใช้งาน](00-getting-started.md)) |

---

## อ้างอิงด่วน (Quick Reference)

| ต้องการ... | ไปที่ | คลิก |
|------------|-------|------|
| ดูสต็อกอะไหล่ทั้งหมด | sidebar → **Spare Parts → สต็อกอะไหล่** | (โหลดอัตโนมัติ) |
| กรองอะไหล่สต็อกต่ำ | Spare Parts → สต็อกอะไหล่ | ตัวกรองสถานะ → **LOW_STOCK** |
| สร้างอะไหล่ใหม่ | Spare Parts → สต็อกอะไหล่ | **+ สร้างอะไหล่** → กรอกฟอร์ม → **บันทึก** |
| แก้ไขอะไหล่ | Spare Parts → สต็อกอะไหล่ | เมนู **(⋮)** → **แก้ไข** |
| ตั้งค่าสต็อกต่อคลัง | หน้ารายละเอียดอะไหล่ → แท็บคลังสินค้า | **+ เพิ่มคลังสินค้า** → กรอกจำนวน → **บันทึก** |
| จัดการคลังสินค้า | Spare Parts → **คลังสินค้า** | สร้าง/แก้ไข/ปิดใช้งานคลัง |
| อนุมัติคำขอเบิก | Spare Parts → **คำขอเบิกอะไหล่** | เปิดคำขอ → **อนุมัติ** |
| ปฏิเสธคำขอเบิก | Spare Parts → **คำขอเบิกอะไหล่** | เปิดคำขอ → **ไม่อนุมัติ** → เลือกเหตุผล → **ยืนยัน** |
| สร้างรายการโอนย้าย | Spare Parts → **โอนย้ายอะไหล่** | **+ สร้างรายการโอนย้าย** → กรอกฟอร์ม → **บันทึก** |
| รับคืนอะไหล่ | Spare Parts → **คืนอะไหล่** | เปิดรายการ → **รับคืน** |
| ปฏิเสธการคืน | Spare Parts → **คืนอะไหล่** | เปิดรายการ → **ปฏิเสธ** → เลือกเหตุผล → **ยืนยัน** |
| ดูการใช้อะไหล่ต่อใบงาน | Spare Parts → **การใช้อะไหล่** | กรองตามวันที่/ช่าง/ใบงาน |
| ส่งออกข้อมูลสต็อก | Spare Parts → สต็อกอะไหล่ | **ดาวน์โหลด** → CSV |
| นำเข้าข้อมูลสต็อก | Spare Parts → สต็อกอะไหล่ | **นำเข้า** → อัปโหลด CSV → ยืนยัน |
| ดูประวัติสต็อก | หน้าแก้ไขอะไหล่ → แท็บ **ประวัติ** | (โหลดไทม์ไลน์) |
| ดูสรุปสต็อกต่ำ | **Dashboard** (หน้าหลัก) | การ์ดสต็อกต่ำ → คลิกดูรายละเอียด |

---

## ภาพหน้าจอที่ต้องเพิ่ม

> **หมายเหตุ:** มีภาพต้นฉบับที่ถ่ายไว้แล้วบางส่วนที่ `00-assets/images/sparepart/` ใช้เป็นแหล่งอ้างอิงในการเตรียมภาพ แต่ไฟล์ที่อ้างในคู่มือต้องใช้พาธ `images/06-` ตามตารางด้านล่าง

| # | สิ่งที่ต้องถ่าย | เส้นทางหน้า |
|---|----------------|-------------|
| 1 | รายการสต็อกอะไหล่พร้อมป้ายสถานะ เขียว/เหลือง/เทา | `/spare-part-stock` |
| 2 | ปุ่ม "+ สร้างอะไหล่" ถูกไฮไลต์ (มุมขวาบน) | `/spare-part-stock` |
| 3 | ฟอร์มสร้างอะไหล่แสดงทุกช่องและส่วนเลือกคลัง | `/spare-part-stock/create` |
| 4 | หน้ารายละเอียดอะไหล่ แท็บคลังสินค้า แสดงสต็อกต่อคลัง | `/spare-part-stock/edit/[id]` (แท็บคลังสินค้า) |
| 5 | รายการคลังสินค้าแสดงหลายคลัง | `/spare-part-location` |
| 6 | ฟอร์มสร้างคลังสินค้า | `/spare-part-location/create` |
| 7 | รายการคำขอเบิกพร้อมแท็บกรองและรายละเอียดสำคัญ | `/spare-part-request` |
| 8 | หน้ารายละเอียดคำขอเบิกพร้อมรูปภาพและปุ่มอนุมัติ/ไม่อนุมัติ | `/spare-part-request/edit/[id]` |
| 9 | Modal ปฏิเสธคำขอพร้อม dropdown เหตุผลและช่องหมายเหตุ | `/spare-part-request/edit/[id]` (modal ปฏิเสธ) |
| 10 | รายการโอนย้ายอะไหล่ | `/spare-part-transaction` |
| 11 | ฟอร์มสร้างรายการโอนย้าย (ต้นทาง/ปลายทาง/อะไหล่) | `/spare-part-transaction/create` |
| 12 | รายการคืนอะไหล่ที่รอดำเนินการ | `/spare-part-return` |
| 13 | หน้ารายละเอียดการคืนพร้อมรูปภาพและส่วนตรวจสอบสภาพ | `/spare-part-return/edit/[id]` |
| 14 | Modal ประวัติการคืนอะไหล่ | `/spare-part-return/edit/[id]` (modal ประวัติ) |
| 15 | รายการการใช้อะไหล่พร้อมตัวกรอง | `/spare-part-used` |
| 16 | Modal นำเข้า CSV พร้อมลิงก์ดาวน์โหลดเทมเพลต | `/spare-part-stock` (modal นำเข้า) |
| 17 | รายการสต็อกกรองด้วย LOW_STOCK แสดงป้ายสีเหลือง | `/spare-part-stock` (ตัวกรองสถานะ LOW_STOCK) |
| 18 | แท็บประวัติสต็อกแสดงไทม์ไลน์การเคลื่อนไหว | `/spare-part-stock/edit/[id]` (แท็บประวัติ) |
| 19 | การ์ดสรุปสต็อกต่ำบน Dashboard | `/dashboard` |

---

*อ้างอิง: FR-014, UF-014 · ยึดมาตรฐาน `06-support/user-manual-writing-standard.md`*
