Dùng dòng API tùy chỉnh trong mẫu báo cáo tài chính
Tài liệu ERPNext tiếng Việt: Dùng dòng API tùy chỉnh trong mẫu báo cáo tài chính
Nova Industries cần một dòng trên báo cáo quản trị mà nhóm phân loại tài khoản không tạo ra được: một chỉ tiêu hoạt động đã điều chỉnh theo ngân sách, do ứng dụng tùy chỉnh (custom app) của công ty tính. Giá trị này phải hiện cạnh các dòng tài khoản chuẩn và các công thức phía sau phải dùng được nó.
Trong Mẫu báo cáo tài chính, dòng có Nguồn dữ liệu (Data Source) là Custom API sẽ gọi một hàm Python phía máy chủ đã được duyệt. Chỉ dùng khi dòng Dữ liệu tài khoản (Account Data) và Số tính toán (Calculated Amount) không đáp ứng được yêu cầu. Đây là tính năng nâng cao dành cho lập trình viên, không phải cách để báo cáo gọi một địa chỉ HTTP bên ngoài.
Trước khi bắt đầu
- Dùng một site cài và triển khai được ứng dụng Frappe tùy chỉnh.
- Viết và kiểm thử một hàm Python ở cấp module trong ứng dụng đó.
- Kiểm tra hiệu năng, phân quyền, phạm vi truy cập dữ liệu và xử lý lỗi của hàm.
- Tạo hoặc xác định Mẫu báo cáo tài chính cần thêm dòng này.

Thêm dòng Custom API

- Mở Mẫu báo cáo tài chính.
- Thêm một dòng vào bảng Các dòng báo cáo (Report Line Items) và mở màn hình sửa dòng.
- Đặt Nguồn dữ liệu là Custom API.
- Nhập đường dẫn Python dạng chấm, ví dụ
my_app.financial_report_api.get_budget_variance. - Nếu các dòng công thức phía sau cần giá trị trả về, đặt Mã dòng (Line Reference).
- Cấu hình Đảo dấu (Reverse Sign), Ẩn nếu bằng 0 (Hide If Zero), Dòng ẩn (Hidden Line), Đưa vào biểu đồ (Include in Charts) và Kiểu giá trị (Value Type) khi cần.
- Lưu mẫu và chạy báo cáo tài chính tương ứng.
Quy ước của hàm
ERPNext có thể truyền vào filters của báo cáo, danh sách periods đã tạo và row hiện tại. Hàm trả về một giá trị số cho mỗi kỳ, đúng thứ tự các kỳ.
from frappe.utils import flt
def get_budget_variance(filters=None, periods=None, row=None):
filters = filters or {}
periods = periods or []
values = []
for period in periods:
variance = calculate_variance(
company=filters.get("company"),
from_date=period.from_date,
to_date=period.to_date,
)
values.append(flt(variance))
return valuesYêu cầu với giá trị trả về
| Yêu cầu | Lý do |
|---|---|
| Danh sách giá trị số | Báo cáo cần một số hiển thị được cho mỗi kỳ. |
| Số phần tử bằng số kỳ | Mỗi kỳ hiển thị nhận đúng một kết quả. |
| Cùng thứ tự với các kỳ | Giá trị phải khớp với tiêu đề cột. |
| Mã dòng ổn định | Các dòng tính toán phía sau dùng kết quả API một cách an toàn. |
Hành vi cần lưu ý
- Đường dẫn phải có dạng
app.module.method, và hàm phải nằm trong một ứng dụng đã cài. - Không cần
@frappe.whitelist()chỉ để báo cáo gọi được hàm. - Dòng Custom API không hỗ trợ Server Script.
- ERPNext xử lý dòng Custom API trước kết quả tài khoản và công thức, nên hàm không được phụ thuộc vào các dòng phía sau trong mẫu.
Bảo mật và kiểm thử hàm
- Kiểm tra giá trị bộ lọc đầu vào, dùng truy vấn có xét phân quyền khi cần, không trả về chi tiết nhạy cảm và giới hạn phạm vi truy vấn.
- Kiểm thử kỳ không có dữ liệu, nhiều kiểu chu kỳ, tách biệt giữa các công ty, ngoại tệ, khoảng ngày lớn và các tình huống lỗi.
- Đối chiếu kết quả với một cách tính độc lập trước khi đưa mẫu vào sử dụng.
Xử lý sự cố
Đường dẫn API bị từ chối
Dùng đường dẫn module dạng chấm đầy đủ và kiểm tra hàm được định nghĩa ở cấp module trong một ứng dụng đã cài.
Dòng chỉ hiện số 0
Xem Nhật ký lỗi (Error Log) để tìm lỗi Custom API, kiểm tra hàm có trả về mỗi kỳ một giá trị số không, và chạy thử hàm với đúng bộ lọc của báo cáo.
Dòng tính toán không dùng được kết quả
Đặt cho dòng Custom API một Mã dòng duy nhất và dùng đúng mã đó trong công thức phía sau.
Câu hỏi thường gặp
Không trực tiếp. Mẫu gọi một hàm Python trên máy chủ ERPNext. Chính hàm đó có thể kết nối với hệ thống khác, tùy thiết kế bảo mật và độ tin cậy của ứng dụng.
Không nên. Hàm báo cáo chỉ nên đọc dữ liệu. Tạo hoặc sửa giao dịch trong lúc chạy báo cáo sẽ làm kết quả thiếu an toàn và không lường trước được.
ERPNext ghi lại lỗi và có thể điền số 0 vào dòng. Hãy coi đó là phép tính báo cáo bị lỗi và tìm nguyên nhân trước khi gửi báo cáo cho ai.