Tự Động Hóa Cấp Cao Bằng Scripts (Mã Lệnh)
Khi các tùy biến No-Code (kéo thả giao diện, phân luồng cơ bản) không đáp ứng được các bài toán nghiệp vụ phức tạp của doanh nghiệp, ERPNext mở ra một "vũ khí tối thượng" dành cho quản trị viên: Viết mã lệnh tùy biến (Scripts).
Bài học này hướng dẫn cách sử dụng Client Script (chạy ở giao diện Front-end trình duyệt) để cảnh báo tức thời và Server Script (chạy ở Back-end máy chủ) để chặn đứng các giao dịch bán lỗ dưới giá vốn nước ép chanh của Vicore F&B theo đúng các nguyên tắc kiểm soát nội bộ nghiêm ngặt.
1. Client Script (Phép Thuật Giao Diện Front-end)
Client Script (viết bằng ngôn ngữ JavaScript) chạy trực tiếp trên trình duyệt web của người dùng. Ưu điểm là phản hồi lập tức ngay khi người dùng thao tác gõ phím mà chưa cần lưu chứng từ.
Kịch bản cảnh báo bán dưới giá vốn:
Khi nhân viên kinh doanh tạo Đơn bán hàng (Sales Order) cho WinMart, họ nhập giá bán nước ép chanh TP-LEMON là 12.000 VND / chai. Tuy nhiên, giá vốn sản xuất phân bổ (Valuation Rate) cập nhật từ xưởng đang là 13.500 VND / chai. Nếu duyệt đơn này, Vicore F&B sẽ bị lỗ 1.500 VND/chai.
Chúng ta viết một đoạn Client Script ngắn trên Doctype Sales Order:
- Sự kiện: Ngay khi nhân viên nhập đơn giá bán (
rate) của dòng sản phẩm. - Hành động: So sánh đơn giá bán với giá vốn nhập kho (
incoming_ratehoặcvaluation_rate). Nếu đơn giá nhỏ hơn giá vốn, lập tức hiện một Pop-up thông báo cảnh báo màu vàng ngay trên màn hình:"Cảnh báo: Đơn giá bán nước chanh TP-LEMON (12.000 VND) đang thấp hơn giá vốn sản xuất (13.500 VND). Vui lòng kiểm tra lại trước khi gửi phê duyệt!"
// Client Script trên Sales Order
frappe.ui.form.on('Sales Order Item', {
rate: function(frm, cdt, cdn) {
let item = locals[cdt][cdn];
if (item.rate && item.valuation_rate && item.rate < item.valuation_rate) {
frappe.msgprint({
title: __('Cảnh Báo Giá Bán'),
indicator: 'orange',
message: __('Đơn giá bán của sản phẩm {0} ({1:,.0f} VND) thấp hơn giá vốn ({2:,.0f} VND).',
[item.item_code, item.rate, item.valuation_rate])
});
}
}
});
2. Server Script (Hàng Rào Sắt Back-end - Chặn Bán Lỗ)
Mặc dù có cảnh báo Client Script, nhân viên kinh doanh vẫn có thể bỏ qua Pop-up và cố tình bấm Submit để chốt đơn bán lỗ. Lúc này, dữ liệu được gửi lên máy chủ. Server Script (viết bằng Python) sẽ đóng vai trò là "người gác cổng cuối cùng" bảo vệ Database.
Chúng ta viết một Server Script chạy trên sự kiện before_submit của Doctype Sales Order để chặn đứng giao dịch bán lỗ dưới giá vốn:
- Sự kiện:
before_submit(Trước khi hệ thống cập nhật công nợ và ghi dữ liệu xuống cơ sở dữ liệu). - Hành động: Quét qua các dòng sản phẩm của đơn hàng, nếu phát sinh bất kỳ sản phẩm nào có giá bán nhỏ hơn giá vốn, hệ thống lập tức kích hoạt hàm
frappe.throw()để chặn đứng chứng từ và báo lỗi đỏ lừ trên màn hình, khóa quyền Submit:
# Server Script: Chặn cứng không cho phép bán dưới giá vốn
def execute(doc, method):
for item in doc.items:
# Lấy giá vốn tồn kho của sản phẩm tại kho xuất hàng
valuation_rate = frappe.db.get_value("Bin",
{"item_code": item.item_code, "warehouse": item.warehouse}, "valuation_rate") or 0
if item.rate < valuation_rate:
frappe.throw(
title="CHẶN CỨNG: Nghiêm Cấm Bán Dưới Giá Vốn",
msg=f"Sản phẩm {item.item_code} có giá bán ({item.rate:,.0f} VND) "
f"thấp hơn giá vốn tồn kho ({valuation_rate:,.0f} VND) tại kho {item.warehouse}. "
f"Chứng từ bị từ chối phê duyệt."
)
Dữ liệu lỗi bị chặn ngay tại máy chủ, đảm bảo kỷ luật tài chính tuyệt đối cho doanh nghiệp.
3. Server Script Tự Động Xử Lý Dữ Liệu Định Kỳ
Không chỉ dùng để chặn lỗi, Server Script chạy định kỳ (Scheduled Script) còn giúp tự động hóa chăm sóc khách hàng:
Kịch bản tự động sinh Voucher sinh nhật:
Thiết lập Server Script chạy tự động vào lúc 00:00 hàng ngày:
- Quét danh mục khách hàng thành viên (
Customer), tìm kiếm những khách hàng có ngày sinh nhật là hôm nay. - Tự động gọi hàm tạo mới một mã Gift Card (Thẻ quà tặng) trị giá 100.000 VND (áp dụng mua nước chanh tại POS Showroom).
- Tự động kích hoạt cổng gửi tin nhắn Zalo ZNS/SMS gửi mã thẻ quà tặng đến điện thoại của khách hàng:
"Vicore F&B chúc mừng sinh nhật anh/chị! Xin gửi tặng anh/chị mã thẻ quà tặng mua nước ép chanh tươi trị giá 100.000 VND dùng tại hệ thống cửa hàng POS: [Mã Gift Card]. Hạn dùng 15 ngày."