Giao diện
PHÂN TÍCH NGHIỆP VỤ - PHẦN 2: KHO, GIAO HÀNG, THANH TOÁN
Flow 3: QUẢN LÝ KHO
3.1 Use Cases
UC-201: Nhập Kho Nguyên Vật Liệu
Actor: Thủ kho
Trigger: Mua NVL từ nhà cung cấp
Điều kiện tiên quyết: User có quyền WAREHOUSE
Luồng chính:
- Thủ kho vào menu "Kho > Nhập Kho NVL"
- Nhấn "+ Tạo Phiếu Nhập Mới"
- Hệ thống hiển thị form phiếu nhập:
- Mã phiếu:
NK-YYYYMMDD-XXX(auto generate) - Ngày nhập: [____] (default = hôm nay)
- Kho nhập: [Dropdown: Kho NVL, Kho Phụ...]
- Nhà cung cấp: [____]
- Số hóa đơn NCC: [____]
- Mã phiếu:
- Thêm nguyên vật liệu: a. Nhấn "+ Thêm NVL" b. Tìm kiếm NVL (theo mã hoặc tên) c. IF NVL chưa tồn tại THEN
- Nhấn "Tạo NVL Mới"
- Nhập: Mã, Tên, Loại, Đơn vị, Đơn giá, Specs
- Lưu NVL → Return về form d. Nhập số lượng nhập: [] e. Nhập đơn giá: [] f. Hệ thống tự động tính: Thành tiền = SL × Đơn giá g. Có thể thêm nhiều NVL
- Kiểm tra tổng tiền
- Upload file đính kèm (hóa đơn scan) - optional
- Ghi chú: [____]
- Nhấn "Lưu Phiếu Nhập"
- Hệ thống validate (xem VR-200)
- IF validation OK THEN a. Lưu inventory_transaction (type = IN) b. For each NVL:
- Cập nhật inventory_balances: quantity += số lượng nhập
- IF quantity_after_in >= reorder_point THEN
- Hủy cảnh báo hết hàng (nếu có) c. Log activity d. Hiển thị "Nhập kho thành công" e. In phiếu nhập (optional)
- ELSE
- Hiển thị lỗi validation
- User sửa lại
Data Flow:
NCC giao hàng → Thủ kho kiểm tra
↓
Tạo phiếu nhập trong hệ thống
↓
┌──────────────────┐
│ inventory_ │
│ transactions │
│ (type=IN) │
└────────┬─────────┘
↓
┌──────────────────┐
│ inventory_ │
│ balances │
│ (quantity += X) │
└──────────────────┘Validation Rules:
VR-200: Kho nhập phải tồn tại và type = MATERIAL
VR-201: Phải có ít nhất 1 NVL
VR-202: Mỗi NVL: Số lượng > 0, Đơn giá >= 0
VR-203: Ngày nhập <= Ngày hiện tại
VR-204: Tổng tiền >= 10,000 VNĐ (phiếu nhập tối thiểu)Business Rules:
BR-200: Chỉ thủ kho hoặc Manager mới được nhập kho
BR-201: Phiếu nhập > 10 triệu → Cần Manager duyệt
BR-202: NVL nhập phải match với PO (Purchase Order) nếu có
BR-203: Tự động gửi email thông báo cho Accountant (để đối chiếu công nợ NCC)UC-202: Xuất Kho Sản Xuất
Actor: Thủ kho
Trigger: Production order được approved, cần NVL để sản xuất
Luồng chính:
- Thủ kho vào "Kho > Xuất Kho SX"
- Chọn lệnh sản xuất (production_order) cần xuất NVL
- Hệ thống hiển thị:
- Thông tin lệnh SX
- Danh sách NVL cần thiết (tự động tính toán):
VD: Catalogue 500 cuốn, 20 trang A4 - Giấy C250: 50 tờ (bìa) - Giấy C150: 1000 tờ (ruột) - Mực Cyan: 2 kg - Mực Magenta: 2 kg - Mực Yellow: 2 kg - Mực Black: 3 kg - Màng cán: 30m - Keo nhiệt: 2 kg
- Thủ kho kiểm tra tồn kho thực tế
- For each NVL: a. IF tồn kho đủ THEN
- Tick ☑ để xuất
- Có thể điều chỉnh số lượng xuất (VD: xuất dự phòng thêm 5%) b. ELSE (tồn kho không đủ)
- Hiển thị warning màu đỏ
- Đề xuất: "Cần nhập thêm XX đơn vị"
- Không thể xuất
- IF tất cả NVL đủ THEN a. Nhấn "Xác Nhận Xuất Kho" b. Hệ thống:
- Tạo phiếu xuất
XK-SX-YYYYMMDD-XXX - Tạo inventory_transactions (type = OUT) cho mỗi NVL
- Cập nhật inventory_balances: quantity -= số lượng xuất
- Link phiếu xuất với production_order (reference_type=PO, reference_id=po_id)
- IF quantity_after_out < min_stock THEN
- Tạo cảnh báo "NVL sắp hết"
- Gửi email cho Manager
- Cập nhật production_order thêm field
materials_issued_at = NOW() - Log activity c. In phiếu xuất để giao cho thợ d. Hiển thị "Xuất kho thành công" ELSE
- Hiển thị "Không đủ NVL, không thể xuất kho"
- Liệt kê NVL thiếu
- Đề xuất: "Tạo đơn mua hàng"
- Tạo phiếu xuất
Validation Rules:
VR-210: Production order phải tồn tại và status IN [PENDING, DESIGN, MATERIAL_PREP]
VR-211: Tất cả NVL phải có đủ tồn kho
VR-212: Số lượng xuất > 0 và <= tồn kho
VR-213: Không được xuất 2 lần cho cùng 1 lệnh SX (check đã xuất chưa)Business Rules:
BR-210: Tự động tính toán NVL dựa trên:
- Thông số sản phẩm (kích thước, số lượng, loại giấy...)
- Hệ số phế phẩm (thêm 3-5%)
BR-211: Xuất kho SX phải match với lệnh SX, không được xuất tự do
BR-212: Nếu thiếu NVL → Block lệnh SX, thông báo cho kinh doanh về delayUC-203: Nhập Kho Thành Phẩm
Actor: Hệ thống (tự động) hoặc Thủ kho
Trigger: QC pass (UC-104)
Luồng chính:
- Sau khi QC đạt, hệ thống tự động tạo phiếu nhập kho TP:
- Mã phiếu:
NK-TP-YYYYMMDD-XXX - Kho nhập: Kho Thành Phẩm
- Sản phẩm: Lấy từ production_order
- Số lượng: quantity_output từ công đoạn cuối
- Vị trí kho: Nhập bởi QC (UC-104)
- Mã phiếu:
- Thủ kho nhận thông báo
- Vào xem chi tiết phiếu nhập
- Kiểm tra thực tế:
- Sản phẩm có đúng không?
- Số lượng khớp không?
- Đóng gói ngon lành không?
- IF OK THEN a. Nhấn "Xác Nhận Nhập Kho" b. Hệ thống:
- Lưu inventory_transaction (type = IN, reference_type=PRODUCTION, reference_id=po_id)
- Tạo/Cập nhật inventory_balances cho thành phẩm
- Cập nhật order.status → READY_TO_DELIVER
- Gửi notification cho Sales: "Đơn DH-XXX đã sẵn sàng giao" c. Dán nhãn barcode/QR vào thành phẩm (để dễ tracking) d. Sắp xếp vào vị trí kho đã định ELSE
- Báo lại cho QC: "Không khớp, cần kiểm tra lại"
Business Rules:
BR-220: Thành phẩm phải qua QC mới được nhập kho
BR-221: Mỗi thành phẩm có barcode/QR để tracking
BR-222: Thành phẩm được xếp theo FIFO (First In First Out)
BR-223: Cảnh báo nếu thành phẩm tồn kho > 7 ngày (sợ ẩm mốc)UC-204: Xuất Kho Giao Hàng
Actor: Thủ kho
Trigger: Lên lịch giao hàng (UC-301)
Luồng chính:
- Nhân viên giao hàng (hoặc Sales) tạo lịch giao hàng
- Thủ kho nhận thông báo "Có đơn cần xuất kho giao hàng"
- Vào "Kho > Xuất Kho Giao Hàng"
- Chọn đơn hàng cần xuất
- Hệ thống hiển thị:
- Thông tin khách hàng (tên, địa chỉ, SĐT)
- Danh sách sản phẩm cần giao
- Vị trí kho của từng sản phẩm
- Thủ kho lấy hàng theo vị trí
- Kiểm đếm số lượng
- IF số lượng đủ THEN a. Đóng gói cẩn thận b. Dán nhãn địa chỉ khách hàng c. Nhấn "Xác Nhận Xuất Kho" d. Hệ thống:
- Tạo phiếu xuất
XK-GH-YYYYMMDD-XXX - Tạo inventory_transactions (type = OUT, reference_type=ORDER, reference_id=order_id)
- Cập nhật inventory_balances: quantity -= số lượng giao
- Link với delivery record
- In phiếu giao hàng (3 liên: KH, Giao hàng, Lưu) e. Bàn giao cho nhân viên giao hàng ELSE
- Báo ngay cho Sales: "Không đủ hàng, cần kiểm tra lại"
- Tạo phiếu xuất
Validation Rules:
VR-230: Order phải ở trạng thái READY_TO_DELIVER
VR-231: Thành phẩm phải có đủ tồn kho
VR-232: Không được xuất kho nếu chưa có lịch giao hàngUC-205: Kiểm Kê Tồn Kho
Actor: Thủ kho, Manager
Trigger: Định kỳ (cuối tháng) hoặc đột xuất
Luồng chính:
- Manager tạo phiếu kiểm kê:
- Kho cần kiểm: [____]
- Loại kiểm kê: Toàn bộ / Từng nhóm NVL
- Người thực hiện: [____]
- Ngày kiểm kê: [____]
- Thủ kho nhận nhiệm vụ
- Hệ thống xuất file Excel:
- STT | Mã NVL | Tên NVL | Đơn vị | Tồn sổ sách | Tồn thực tế | Chênh lệch
- Thủ kho đi kiểm đếm thực tế, điền vào cột "Tồn thực tế"
- Upload file Excel đã điền
- Hệ thống parse file, tính chênh lệch
- Hiển thị bảng chênh lệch:
| Mã NVL | Tên | Sổ sách | Thực tế | Chênh lệch | Giá trị CL | |--------|---------------|---------|---------|------------|---------------| | G-C250 | Giấy C250 | 1000 | 980 | -20 | -500,000đ | | M-CYAN | Mực Cyan | 50 | 52 | +2 | +100,000đ | - Thủ kho giải trình lý do chênh lệch cho từng dòng
- Manager review: IF chênh lệch lớn (> 5% hoặc > 10 triệu) THEN
- Yêu cầu kiểm tra lại ELSE
- Duyệt kiểm kê
- Khi duyệt:
- Hệ thống cập nhật inventory_balances theo số liệu thực tế
- Tạo inventory_transactions (type = ADJUST) cho các dòng chênh lệch
- Lưu biên bản kiểm kê
- Log activity
Business Rules:
BR-240: Kiểm kê định kỳ: Mỗi tháng 1 lần (ngày 28-30)
BR-241: Kiểm kê đột xuất khi:
- Nghi ngờ thất thoát
- Trước khi bàn giao thủ kho mới
- Có yêu cầu từ kiểm toán
BR-242: Chênh lệch > 5% → Phải điều tra, báo cáo lên Giám đốc
BR-243: Thủ kho chịu trách nhiệm về chênh lệch (nếu do quản lý kém)Flow 4: GIAO HÀNG & NGHIỆM THU
4.1 Use Cases
UC-301: Lên Lịch Giao Hàng
Actor: Nhân viên kinh doanh
Điều kiện tiên quyết: Order status = READY_TO_DELIVER
Luồng chính:
- Sales vào "Đơn Hàng > Sẵn Sàng Giao"
- Chọn đơn hàng cần giao
- Nhấn "Lên Lịch Giao Hàng"
- Hệ thống hiển thị form:
- Ngày giao: [____] (suggest = required_date từ order)
- Giờ giao: [____] (suggest = 9:00 AM - 17:00 PM)
- Địa chỉ giao: [____] (auto-fill từ order, có thể sửa)
- Hình thức giao:
- ○ Khách tự đến lấy
- ○ Công ty giao (xe própri)
- ○ Chuyển phát nhanh (đối tác)
- ○ Lắp đặt tại chỗ (biển QC)
- IF "Công ty giao" THEN a. Chọn xe: [] (dropdown: Xe tải nhỏ, Xe tải lớn...) b. Chọn tài xế: [] c. Nhập biển số xe: [____]
- IF "Chuyển phát nhanh" THEN a. Chọn đơn vị vận chuyển: [] (Viettel Post, GHTK...) b. Nhập phí vận chuyển: []
- Ghi chú giao hàng: [____]
- Nhấn "Xác Nhận Lịch Giao"
- Hệ thống:
- Tạo delivery record, status = SCHEDULED
- Mã giao hàng:
GH-YYYYMMDD-XXX - Gửi notification cho:
- Thủ kho: "Chuẩn bị hàng cho đơn XX"
- Tài xế: "Lịch giao hàng ngày XX"
- Khách hàng: SMS/Email "Đơn hàng của bạn sẽ được giao vào XX"
- Cập nhật order.status → SCHEDULED_FOR_DELIVERY
- Tạo calendar event (nếu tích hợp)
Validation Rules:
VR-300: Ngày giao >= Ngày hiện tại
VR-301: Ngày giao <= Required date + 2 ngày (không delay quá 2 ngày)
VR-302: IF "Công ty giao" THEN Xe và Tài xế required
VR-303: Địa chỉ giao phải rõ ràng (min 20 ký tự)Business Rules:
BR-300: Ưu tiên giao đơn có ngày gần nhất trước
BR-301: 1 xe chỉ giao tối đa 5 đơn/ngày (nếu trong cùng khu vực)
BR-302: Giao hàng ngoại thành > 50km → Tính phí vận chuyển
BR-303: Gửi SMS nhắc khách trước 1 ngàyUC-302: Xác Nhận Giao Hàng
Actor: Tài xế / Nhân viên giao hàng
Điều kiện tiên quyết: Delivery status = SCHEDULED
Luồng chính:
- Tài xế nhận hàng từ kho (có phiếu giao hàng)
- Trên điện thoại, mở app/web
- Vào "Lịch Giao Hàng Của Tôi"
- Chọn đơn hàng
- Nhấn "Bắt Đầu Giao Hàng"
- Hệ thống cập nhật status → IN_TRANSIT
- Ghi thời gian xuất phát
- Tài xế đến địa chỉ khách hàng
- Gọi điện cho khách thông báo đã đến
- Giao hàng cho khách: a. Khách kiểm tra hàng trước mặt b. IF khách OK THEN
- Tài xế nhấn "Giao Hàng Thành Công"
- Nhập tên người nhận: [____]
- Chụp ảnh chữ ký người nhận (hoặc scan QR từ CCCD)
- Upload ảnh
- Hệ thống:
- Cập nhật delivery.status → DELIVERED
- Ghi delivered_at = NOW()
- Lưu receiver_name, receiver_signature_url
- Cập nhật order.status → DELIVERED
- Gửi notification cho Sales: "Đơn XX đã giao thành công"
- Trigger UC-303 (Nghiệm thu) c. ELSE (Khách không nhận / Có vấn đề)
- Tài xế nhấn "Giao Hàng Thất Bại"
- Chọn lý do:
- ○ Khách không có nhà
- ○ Hàng bị hư hại trong quá trình vận chuyển
- ○ Khách từ chối nhận (không đúng như mong đợi)
- ○ Địa chỉ sai
- ○ Khác: [____]
- Chụp ảnh minh chứng
- Hệ thống:
- Cập nhật delivery.status → FAILED
- Ghi lý do + ảnh
- Thông báo URGENT cho Sales
- Sales liên hệ khách để xử lý
Sequence Diagram:
mermaid
sequenceDiagram
participant Driver as Tài xế
participant App as Mobile App
participant API as Backend
participant DB as Database
participant Notif as Notification
Driver->>App: Nhấn "Bắt đầu giao"
App->>API: PATCH /deliveries/{id}/start
API->>DB: UPDATE status=IN_TRANSIT
DB-->>API: OK
API-->>App: Success
Note over Driver: Đến nơi, giao hàng
Driver->>App: Nhấn "Giao thành công"
Driver->>App: Nhập tên, upload chữ ký
App->>API: PATCH /deliveries/{id}/complete
API->>DB: UPDATE status=DELIVERED, receiver=X
API->>DB: UPDATE order.status=DELIVERED
API->>Notif: Gửi thông báo cho Sales
DB-->>API: OK
API-->>App: Success
App-->>Driver: "Đã xác nhận thành công"Business Rules:
BR-310: Bắt buộc phải có chữ ký/ảnh người nhận (để tránh tranh chấp)
BR-311: Nếu giao thất bại:
- Lần 1: Hẹn giao lại
- Lần 2: Yêu cầu khách tự đến lấy
- Lần 3: Hủy đơn, hoàn tiền cọc
BR-312: Đơn hàng có biển QC phải có ảnh sau khi lắp đặt xongUC-303: Nghiệm Thu Đơn Hàng
Actor: Khách hàng + Nhân viên kinh doanh
Điều kiện tiên quyết: Order status = DELIVERED
Luồng chính:
- Sau khi giao hàng, Sales liên hệ khách để hẹn nghiệm thu (nếu cần)
- Hoặc khách tự xác nhận qua email/SMS: "Nhấn đây để xác nhận đã nhận hàng: [Link]"
- Khách nhấn vào link:
- Hiển thị thông tin đơn hàng
- Checklist đơn giản:
□ Sản phẩm đúng như đơn đặt □ Số lượng đủ □ Chất lượng tốt □ Không bị hư hại
- IF khách tick tất cả THEN a. Nhấn "Xác Nhận Nghiệm Tu" b. Nhập tên người nghiệm thu (confirm lại) c. Chữ ký điện tử (vẽ trên màn hình hoặc upload ảnh) d. Hệ thống:
- Tạo biên bản nghiệm thu (PDF)
- Lưu chữ ký
- Cập nhật order.status → ACCEPTED
- Trigger UC-401 (Thanh toán phần còn lại)
- Gửi biên bản qua email cho cả 2 bên ELSE a. Nhấn "Có Vấn Đề Cần Giải Quyết" b. Mô tả vấn đề: [____] c. Upload ảnh minh chứng d. Hệ thống:
- Tạo complaint record
- Gửi URGENT notification cho Sales + Manager
- Sales liên hệ khách ngay để xử lý (UC-304)
Business Rules:
BR-320: Khách có 48h kể từ lúc nhận hàng để nghiệm thu
BR-321: Nếu quá 48h không phản hồi → Tự động coi như đã nghiệm thu
BR-322: Đơn > 50 triệu → Phải có nghiệm thu bằng văn bản (email confirm)
BR-323: Biển quảng cáo phải có ảnh lắp đặt trong biên bảnUC-304: Xử Lý Khiếu Nại
Actor: Nhân viên kinh doanh, Manager, QC
Trigger: Khách không chấp nhận nghiệm thu (UC-303)
Luồng chính:
Sales nhận thông báo "Khách khiếu nại đơn XX"
Xem chi tiết khiếu nại:
- Vấn đề khách gặp phải
- Ảnh minh chứng
- Mức độ nghiêm trọng (tự động đánh giá hoặc khách chọn)
Sales liên hệ khách để tìm hiểu rõ hơn
Phân loại vấn đề:
Trường hợp 1: Lỗi nhỏ, sửa được ngay
- VD: Bị bẩn 1 chút, góc bị cong nhỏ
- Hành động: Cử nhân viên ra sửa/thay ngay
- Timeline: 2-4h
Trường hợp 2: Lỗi vừa, cần đổi hàng
- VD: Màu lệch nhiều, thiếu 1 phần nhỏ
- Hành động: In/Làm lại phần lỗi, giao đổi trong 1-2 ngày
- Timeline: 1-2 ngày
Trường hợp 3: Lỗi lớn, phải làm lại toàn bộ
- VD: Sai thiết kế hoàn toàn, in sai sản phẩm
- Hành động:
- Họp 3 bên: Khách - Công ty - QC
- Lập biên bản xác định lỗi
- Cam kết làm lại toàn bộ
- Timeline: 5-7 ngày
- Bồi thường (nếu do lỗi công ty)
Trường hợp 4: Tranh chấp (không rõ lỗi ai)
- VD: Khách nói màu lệch, nhưng QC nói đúng mẫu
- Hành động:
- Mời khách đến xưởng so sánh với mẫu gốc
- Nếu đúng mẫu → Giải thích cho khách hiểu
- Nếu khách vẫn không đồng ý → Đề xuất giải pháp trung gian (giảm giá 10-20%)
- Cần Manager approval
Sau khi xử lý xong:
- Cập nhật complaint status → RESOLVED
- Yêu cầu khách xác nhận lại (UC-303)
- Nếu khách OK → Chuyển sang ACCEPTED
Nếu không xử lý được:
- Báo cáo lên Giám đốc
- Cân nhắc hoàn tiền
Business Rules:
BR-330: Lỗi do công ty → Làm lại miễn phí + Bồi thường delay (nếu có)
BR-331: Lỗi do khách (đổi ý, yêu cầu mới) → Tính phí 30-50%
BR-332: Tranh chấp không giải quyết được → Hoàn 100% tiền cọc
BR-333: Mọi khiếu nại phải được giải quyết trong 7 ngày
BR-334: Có biên bản xác nhận của cả 2 bên sau khi xử lý
---
**Kết thúc Flow 4: Giao Hàng & Nghiệm Thu**
> 💡 **Lưu ý**: Tài liệu này là phần 2 của bộ SRS.
> - **Phần trước**: [Flow 1 & 2: Đơn Hàng & Sản Xuất](02-PHAN-TICH-NGHIEP-VU.md)
> - **Phần tiếp theo**: [Flow 5 & 6: Thanh Toán & Báo Cáo](02-PHAN-TICH-NGHIEP-VU-P3.md)