Báo cáo (Report) và biểu đồ (Chart) trong Openbravo POS

Báo cáo là một vấn đề rất quan trọng trong các phần mềm quản lý, đặc biệt là phần mềm quản lý bán hàng.  Nó thống kê đưa ra những thông tin hết sức chi tiết và quan trọng giúp cho đội ngũ nhân viên, lãnh đạo có thể nắm rõ tình hình kinh doanh để từ đó có thể đưa ra những quyết định. Sau đây là bài viết giới thiệu chung về báo cáo và biều đồ trong Openbravo POS. Sau bài biết này các bạn có thể hình dung được cấu trúc một báo cáo trong Openbravo, cũng như cách thức để chỉnh sửa và tạo ra các báo cáo này một cách dễ dàng. Ở bài tiếp theo tôi sẽ hướng dẫn cụ thể cách tạo một báo cáo trong Openbravo POS.
I. Giới thiệu
Hướng dẫn này đề cập đến phiên bản Openbravo POS 2.3 và các phiên bản kế tiếp. Nó nhằm mục đích hiển thị cho các nhà phát triển của Openbravo POS làm thế nào để tạo ra và duy trì các báo cáo và làm thế nào để thêm các báo cáo này vào menu của Openbravo POS.
Một cơ cấu mới cho các báo cáo đã được giới thiệu trong Openbravo 2,10 làm cho việc tạo và sửa các báo cáo một cách dễ dàng hơn. Với cấu trúc mới này các nhà phát triển Openbravo POS sẽ có thể thêm và sửa đổi dễ dàng các báo cáo mới và biểu đồ mà không cần phải tác động đến các đoạn source.
Báo cáo được xác định bằng cách sử dụng các tập tin văn bản đơn giản và các nhà phát triển có thể chỉnh sửa bằng cách sử dụng các chương trình soạn thảo văn bản ưa thích của mình hay một nhà thiết kế đồ họa. Để cài đặt báo cáo mới được tạo ra thì chỉ đơn giản copy file báo cáo vừa được tạo vào thư mục  reports
và tạo ra một tùy chọn menu cho báo cáo. Tất cả các báo cáo và biểu đồ của Openbravo POS đã được chuyển đến các cơ cấu mới và các báo cáo mới đã được tạo ra.

II. Kiến trúc của các báo cáo trong Openbravo POS

Các file báo cáo được lưu trữ trong thư mục con Reports thuộc thư mục cài đặt của Openbravo POS. Bên trong thư mục này, các báo cáo có thể được tổ chức trong các gói mà các gói này không có gì khác hơn một cấu trúc cây thư mục.
Ví dụ các báo cáo cơ bản của Openbravo được nằm trong gói com.openbravo.reports có nghĩa là nó nằm trong thư mục con com/openbravo/reports/.
Một báo cáo được định nghĩa trong Openbravo POS bao gồm 3 hoặc nhiều file:  File cấu hình, file báo cáo và bản dịch của file.
  • Các file cấu hình là quan trong nhất, ở đây bạn định nghĩa được title, các câu SQL để có thể lấy được dữ liệu report, tham số, các trường, cái gì là file báo cáo và cái gì là bản dịch của báo cáo.
  • Openbravo POS sử dụng  JasperReports để chạy các báo cáo các file báo cáo là file JasperReports. Bạn có thể chỉnh sửa các file báo cáo này bằng các trình soạn thảo văn bản hoặc bất kỳ công cụ đồ họa nào cho JasperReports ví dụ  như iReport.
  • File dịch dùng để các định các thành phần cần được dịch


1. File định nghĩa:

File định nghĩa là các tập tin có phần mở rộng là .bs và được môt tả bằng cách sử dụng ngôn ngữ kịch bản BeanShell. Ngôn ngữ này rất giống với java hoặc javascript và bạn sẽ không cần kỹ năng đặc biệt để định nghĩa một báo cáo mới trong Openbravo POS.
Sau đây là file products.bs để định nghĩa báo cáo danh sách các sản phẩm:
report = new com.openbravo.pos.reports.PanelReportBean();
report.setTitleKey("Menu.Products"); report.setReport("/com/openbravo/reports/products"); report.setResourceBundle("com/openbravo/reports/products_messages"); report.setSentence(   "SELECT PRODUCTS.ID, PRODUCTS.REFERENCE, PRODUCTS.CODE, PRODUCTS.NAME, " +   "PRODUCTS.PRICEBUY, PRODUCTS.PRICESELL, " +   "(PRODUCTS.PRICESELL * (1 + TAXES.RATE)) AS PRICESELLTAX, " +   "TAXES.NAME AS TAXNAME, TAXES.RATE AS TAXRATE, PRODUCTS.CATEGORY, " +   "CATEGORIES.NAME AS CATEGORYNAME " +   "FROM PRODUCTS LEFT OUTER JOIN CATEGORIES ON PRODUCTS.CATEGORY = CATEGORIES.ID " +   "LEFT OUTER JOIN TAXES ON PRODUCTS.TAX = TAXES.ID " +   "WHERE ?(QBF_FILTER) " +   "ORDER BY CATEGORIES.NAME, PRODUCTS.NAME"); report.addParameter("PRODUCTS.NAME"); report.addParameter("PRODUCTS.PRICEBUY"); report.addParameter("PRODUCTS.PRICESELL"); report.addParameter("PRODUCTS.CATEGORY"); report.addParameter("PRODUCTS.CODE"); report.addQBFFilter(new com.openbravo.pos.ticket.ProductFilter()); report.addField("ID", com.openbravo.data.loader.Datas.STRING); report.addField("REFERENCE", com.openbravo.data.loader.Datas.STRING); report.addField("CODE", com.openbravo.data.loader.Datas.STRING); report.addField("NAME", com.openbravo.data.loader.Datas.STRING); report.addField("PRICEBUY", com.openbravo.data.loader.Datas.DOUBLE); report.addField("PRICESELL", com.openbravo.data.loader.Datas.DOUBLE); report.addField("PRICESELLTAX", com.openbravo.data.loader.Datas.DOUBLE); report.addField("TAXNAME", com.openbravo.data.loader.Datas.STRING); report.addField("TAXRATE", com.openbravo.data.loader.Datas.DOUBLE); report.addField("CATEGORY", com.openbravo.data.loader.Datas.STRING); report.addField("CATEGORYNAME", com.openbravo.data.loader.Datas.STRING);

IV. Định nghĩa một đối tượng báo cáo:
report = new com.openbravo.pos.reports.PanelReportBean();

Dòng trên tạo mới một report. Tên biến phải có tên là report vì đây là tên biến mà Openbravo POS sẽ sử dụng để xác định báo cáo, và đối tượng vừa tạo là một thành viên của lớp com.openbravo.pos.reports.PanelReportBean đây là lớp cơ sở cho tất các báo cáo trong Openbravo POS. Bạn không cần thay đổi dòng này trong báo cáo bạn tạo ra.

2. Thuộc tính của báo cáo:

report.setTitleKey("Menu.Products");
report.setReport("/com/openbravo/reports/products"); report.setResourceBundle("com/openbravo/reports/products_messages")

Dòng này định nghĩa tiêu đề của báo cáo, file JasperReports .jrxml và file localization properties.

3. Report sentence
report.setSentence(
  "SELECT PRODUCTS.ID, PRODUCTS.REFERENCE, PRODUCTS.CODE, PRODUCTS.NAME, " +   "PRODUCTS.PRICEBUY, PRODUCTS.PRICESELL, " +   "(PRODUCTS.PRICESELL * (1 + TAXES.RATE)) AS PRICESELLTAX, " +   "TAXES.NAME AS TAXNAME, TAXES.RATE AS TAXRATE, PRODUCTS.CATEGORY, " +   "CATEGORIES.NAME AS CATEGORYNAME " +   "FROM PRODUCTS LEFT OUTER JOIN CATEGORIES ON PRODUCTS.CATEGORY = CATEGORIES.ID " +   "LEFT OUTER JOIN TAXES ON PRODUCTS.TAX = TAXES.ID " +   "WHERE ?(QBF_FILTER) " +   "ORDER BY CATEGORIES.NAME, PRODUCTS.NAME");

Xác định câu lệnh SQL được sử dụng trong báo cáo. Chú ý đến tag ?(QBF_FILTER)  nó xác định vị trí nơi Openbravo POS sẽ chứa các bộ lọc SQL được tạo ra với các tham số khai báo của báo cáo.

4. Tham số báo cáo:
report.addParameter("PRODUCTS.NAME");
report.addParameter("PRODUCTS.PRICEBUY"); report.addParameter("PRODUCTS.PRICESELL"); report.addParameter("PRODUCTS.CATEGORY"); report.addParameter("PRODUCTS.CODE"); report.addQBFFilter(new com.openbravo.pos.ticket.ProductFilter());

Đây là những dòng định nghĩa các tham số báo cáo và liên hệ giữa các trường của câu lệnh SQL và giao diện hiển thị để người dùng có thể chỉnh sửa các giá trị tham số
Có một số các bộ lọc được xác định trước QBF (Query by form) trong Openbravo POS và mỗi một bộ lọc QBF yêu cầu một tham số được sửa. Bạn có thể kết hợp nhiều hơn một bộ lọc QBF. Bạn chỉ cần duy trì theo thứ tự trong các tham số và trong các bộ lọc.Đây là một ví dụ về 3 bộ lọc QBF với định nghĩa thông số của nó theo thứ tự:.

report.addParameter("STOCKDIARY.DATENEW");
report.addParameter("STOCKDIARY.DATENEW"); report.addQBFFilter(new com.openbravo.pos.reports.JParamsDatesInterval()); report.addParameter("LOCATIONS.ID"); report.addQBFFilter(new com.openbravo.pos.reports.JParamsLocationWithFirst()); report.addParameter("STOCKDIARY.REASON"); report.addQBFFilter(new com.openbravo.pos.reports.JParamsReason());

  • com.openbravo.pos.ticket.ProductFilter

Bộ lọc này dùng để lọc các sản phẩm và sử dụng 5 trường tham số : the name, the buy price, the sell price, the category ID và the barcode của sản phẩm
  • com.openbravo.pos.reports.JParamsDatesInterval

Bộ lọc này thường được sử dụng để chọn một khoảng thời gian ngày tháng,nó yêu cầu 2 trường ngày,và thường cùng một trường dữ liệu.
  • com.openbravo.pos.reports.JParamsLocation, com.openbravo.pos.reports.JParamsLocationWithFirst

Những bộ lọc này được sử dụng để chọn vị trí kho. Nó yêu cầu trường ID của vị trí. Sự khác nhau giữa 2 bộ lọc là với JParamsLocation nó bắt buộc phải chọn một vị trí kho còn với  JParamsLocationWithFirst thì không.
  • com.openbravo.pos.reports.JParamsReason

This filter is used to select a warehouse diary movement reason. It requires the reason field.
  • com.openbravo.pos.reports.JParamsCustomer

This filter is used to select a customer. It requires the customer ID and the customer name fields.
  • com.openbravo.pos.reports.JParamsText

Đây là bộ lọc chung cho một trường. Nó hỗ trợ 3 constructors: JParamsText(String lable) xác định tiêu đề trường và lọc bất kỳ trường văn bản nào. JParamsText(String label, Formats format) Nó xác định tiều đề và định dạng để hiển thị dữ liệu. Và JParamsText(String label, Formats format, Datas data) xác định tên tiêu đề, định dạng để hiển thị dữ liệu và kiểu trường dữ liệu.

The following Formatsare available:
Formats.INT
Formats.DOUBLE Formats.CURRENCY Formats.PERCENT Formats.DATE Formats.TIME Formats.TIMESTAMP Formats.BOOLEAN Formats.STRING

Và các dữ liệu sau:
Datas.INT
Datas.DOUBLE Datas.TIMESTAMP Datas.BOOLEAN Datas.STRING

5. Trường báo cáo:
report.addField("ID", com.openbravo.data.loader.Datas.STRING);
report.addField("REFERENCE", com.openbravo.data.loader.Datas.STRING); report.addField("CODE", com.openbravo.data.loader.Datas.STRING); report.addField("NAME", com.openbravo.data.loader.Datas.STRING); report.addField("PRICEBUY", com.openbravo.data.loader.Datas.DOUBLE); report.addField("PRICESELL", com.openbravo.data.loader.Datas.DOUBLE); report.addField("PRICESELLTAX", com.openbravo.data.loader.Datas.DOUBLE); report.addField("TAXNAME", com.openbravo.data.loader.Datas.STRING); report.addField("TAXRATE", com.openbravo.data.loader.Datas.DOUBLE); report.addField("CATEGORY", com.openbravo.data.loader.Datas.STRING); report.addField("CATEGORYNAME", com.openbravo.data.loader.Datas.STRING);

III. File báo cáo:
Các file báo cáo mà một tập tin có phần mở rộng  .jrxml với cú pháp JasperReport.
Có một hạn chế khi lập báo cáo bên trong Openbravo POS. Các dữ liệu chỉ được sử dụng để thiết lập báo cáo là tập hợp dữ liệu được tạo ra trong tập tin định nghĩa và vì lý do này không có thể sử dụng bộ dữ liệu khác.Ví dụ như bạn không thể tạo ra một báo cáo con bên trong một báo cáo!
Đây là giao diện một file báo cáo khi mở bằng chương trình Jreport
Để thực hiện các báo cáo trên Openbravo POS bạn sẽ phải sử dụng các hàm tiện ích dùng để định nghĩa và phát triển báo cáo:
1. Localization
Các thành phần khi bản địa hóa (Ví dụ như các từ khóa trong file việt hóa) sẽ được chuyển đến báo cáo với cú pháp dạng như sau:
$R{label.title}

2. Định dạng giá trị:
Chúng ta có thể định dạng các giá trị bằng cách sử dụng lớp Format của Openbravo POS. Ví dụ:
com.openbravo.format.Formats.CURRENCY.formatValue($F{PRICESELLTAXDIFF})

3. Chèn hình ảnh
 Chúng ta có thể chèn một hình ảnh vào báo cáo Openbravo POS sử dụng lớp ImageUtil, ví dụ:
com.openbravo.data.loader.ImageUtils.readImageFromResource("/com/openbravo/images/poweredby.png")

4. Tạo mã vạch
 Một chức năng hết sức quant trọng đó là tạo mã vạch, cái này tạo ra được nhận biết bởi máy quét mã vạch, Để tạo mã vạch bạn có thể dùng các phương thức sau:
Với mã vạch EAN-13:
com.openbravo.pos.util.BarcodeImage.getBarcodeEAN13($F{CODE})
Với mã vạch  Code 128:
com.openbravo.pos.util.BarcodeImage.getBarcodeCODE128($F{CODE})


--------------------------------------------------------------------
Mọi thắc mắc xin để lại comment hoặc gửi vào mail: ncm2312@gmail.com

2 nhận xét:

  1. I have a good news. Openbravo POS is not die. I am fork it. You can upgrade Openbravo POS 2.30.2 to NORD POS by one click. NORD POS include discounts, QR-codes, enchance stock managment and more other. Also NORD POS support mobile web-apps.

    Trả lờiXóa
  2. Wow, I'll try it. But Do you open source it does not ?

    Trả lờiXóa

Rất mong các ý kiến của các bạn khi đọc bài viết này !