/*
* KeyStatisticsSalesReportView.java
*
* Created on March 10, 2007, 2:53 AM
*/
package com.floreantpos.ui.report;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import javax.swing.DefaultComboBoxModel;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRTableModelDataSource;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.view.JRViewer;
import com.floreantpos.main.Application;
import com.floreantpos.model.Terminal;
import com.floreantpos.model.UserType;
import com.floreantpos.model.dao.SalesSummaryDAO;
import com.floreantpos.model.dao.TerminalDAO;
import com.floreantpos.model.dao.UserTypeDAO;
import com.floreantpos.report.SalesAnalysisReportModel;
import com.floreantpos.report.SalesStatistics;
import com.floreantpos.report.SalesAnalysisReportModel.SalesAnalysisData;
import com.floreantpos.report.SalesStatistics.ShiftwiseDataTableModel;
import com.floreantpos.swing.ListComboBoxModel;
import com.floreantpos.ui.dialog.POSMessageDialog;
/**
*
* @author mshahriar
*/
public class SalesSummaryReportView extends javax.swing.JPanel {
public static final int REPORT_KEY_STATISTICS = 1;
public static final int REPORT_SALES_ANALYSIS = 2;
private int reportType;
/** Creates new form KeyStatisticsSalesReportView */
public SalesSummaryReportView() {
initComponents();
UserTypeDAO dao = new UserTypeDAO();
List<UserType> userTypes = dao.findAll();
Vector list = new Vector();
list.add(null);
list.addAll(userTypes);
cbUserType.setModel(new DefaultComboBoxModel(list));
TerminalDAO terminalDAO = new TerminalDAO();
List terminals = terminalDAO.findAll();
terminals.add(0, "ALL");
cbTerminal.setModel(new ListComboBoxModel(terminals));
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
private void initComponents() {
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
jLabel3 = new javax.swing.JLabel();
jLabel4 = new javax.swing.JLabel();
fromDatePicker = new org.jdesktop.swingx.JXDatePicker();
toDatePicker = new org.jdesktop.swingx.JXDatePicker();
cbUserType = new javax.swing.JComboBox();
cbTerminal = new javax.swing.JComboBox();
btnGo = new javax.swing.JButton();
jSeparator1 = new javax.swing.JSeparator();
reportPanel = new javax.swing.JPanel();
jLabel1.setText("From:");
jLabel2.setText("To:");
jLabel3.setText("User Type:");
jLabel4.setText("Terminal:");
btnGo.setText("GO");
btnGo.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
showReport(evt);
}
});
reportPanel.setLayout(new java.awt.BorderLayout());
org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING).add(
layout.createSequentialGroup().addContainerGap().add(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING).add(jSeparator1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 502, Short.MAX_VALUE).add(
layout.createSequentialGroup().add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING).add(jLabel1).add(jLabel2)).addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED).add(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false).add(toDatePicker, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).add(fromDatePicker, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)).add(20, 20, 20).add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING).add(jLabel3).add(jLabel4)).addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED).add(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false).add(cbTerminal, 0, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).add(cbUserType, 0, 137, Short.MAX_VALUE)).addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED).add(btnGo,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 72, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)).add(reportPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 502, Short.MAX_VALUE)).addContainerGap()));
layout.setVerticalGroup(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING).add(
layout.createSequentialGroup().addContainerGap().add(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING).add(jLabel3).add(
layout.createSequentialGroup().add(cbUserType, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE).addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED).add(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE).add(jLabel4).add(cbTerminal, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE).add(btnGo))).add(
layout.createSequentialGroup().add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING).add(jLabel1).add(fromDatePicker, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED).add(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING).add(jLabel2).add(toDatePicker, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))).addPreferredGap(
org.jdesktop.layout.LayoutStyle.RELATED).add(jSeparator1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 10, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE).addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED).add(reportPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 303,
Short.MAX_VALUE).addContainerGap()));
layout.linkSize(new java.awt.Component[] { cbTerminal, cbUserType, jLabel3, jLabel4 }, org.jdesktop.layout.GroupLayout.VERTICAL);
layout.linkSize(new java.awt.Component[] { fromDatePicker, jLabel1, jLabel2, toDatePicker }, org.jdesktop.layout.GroupLayout.VERTICAL);
}// </editor-fold>//GEN-END:initComponents
private boolean initCriteria() {
fromDate = fromDatePicker.getDate();
toDate = toDatePicker.getDate();
if (fromDate.after(toDate)) {
POSMessageDialog.showError(Application.getInstance().getBackOfficeWindow(), "From date cannot be greater than to date.");
return false;
}
dateDiff = (int) ((toDate.getTime() - fromDate.getTime()) * (1.15740741 * Math.pow(10, -8))) + 1;
userType = (UserType) cbUserType.getSelectedItem();
// if (userType.equalsIgnoreCase("all")) {
// userType = null;
// }
terminal = null;
if (cbTerminal.getSelectedItem() instanceof Terminal) {
terminal = (Terminal) cbTerminal.getSelectedItem();
}
Calendar calendar = Calendar.getInstance();
calendar.clear();
Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(fromDate);
calendar.set(Calendar.YEAR, calendar2.get(Calendar.YEAR));
calendar.set(Calendar.MONTH, calendar2.get(Calendar.MONTH));
calendar.set(Calendar.DATE, calendar2.get(Calendar.DATE));
calendar.set(Calendar.HOUR, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
fromDate = calendar.getTime();
calendar.clear();
calendar2.setTime(toDate);
calendar.set(Calendar.YEAR, calendar2.get(Calendar.YEAR));
calendar.set(Calendar.MONTH, calendar2.get(Calendar.MONTH));
calendar.set(Calendar.DATE, calendar2.get(Calendar.DATE));
calendar.set(Calendar.HOUR, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
toDate = calendar.getTime();
return true;
}
private void showReport(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_showReport
try {
if (!initCriteria()) {
return;
}
if (reportType == REPORT_KEY_STATISTICS) {
showKeyStatisticsReport();
}
else if (reportType == REPORT_SALES_ANALYSIS) {
showSalesAnalysisReport();
}
} catch (Exception e) {
POSMessageDialog.showError(this, "We are unnable to serve the request, pleas try again", e);
}
}//GEN-LAST:event_showReport
private void showSalesAnalysisReport() throws Exception {
SalesSummaryDAO dao = new SalesSummaryDAO();
List<SalesAnalysisData> datas = dao.findSalesAnalysis(fromDate, toDate, userType, terminal);
Map properties = new HashMap();
ReportUtil.populateRestaurantProperties(properties);
properties.put("subtitle", "SALES SUMMARY REPORT");
properties.put("reportTime", fullDateFormatter.format(new Date()));
properties.put("fromDate", shortDateFormatter.format(fromDate));
properties.put("toDate", shortDateFormatter.format(toDate));
if (userType == null) {
properties.put("reportType", "System Total");
}
else {
properties.put("reportType", userType);
}
properties.put("shift", "All");
properties.put("centre", terminal == null ? "ALL" : terminal.getName());
properties.put("days", String.valueOf(dateDiff));
JasperReport report = (JasperReport) JRLoader.loadObject(getClass().getResource("/com/floreantpos/ui/report/sales_summary_report2.jasper"));
JasperPrint print = JasperFillManager.fillReport(report, properties, new JRTableModelDataSource(new SalesAnalysisReportModel(datas)));
openReport(print);
}
private void showKeyStatisticsReport() throws Exception {
SalesSummaryDAO dao = new SalesSummaryDAO();
SalesStatistics summary = dao.findKeyStatistics(fromDate, toDate, userType, terminal);
Map properties = new HashMap();
ReportUtil.populateRestaurantProperties(properties);
properties.put("subtitle", "SALES SUMMARY REPORT");
properties.put("Capacity", String.valueOf(summary.getCapacity()));
properties.put("GuestCount", String.valueOf(summary.getGuestCount()));
properties.put("GuestPerSeat", Application.formatNumber(summary.getGuestPerSeat()));
properties.put("reportTime", fullDateFormatter.format(new Date()));
properties.put("fromDate", shortDateFormatter.format(fromDate));
properties.put("toDate", shortDateFormatter.format(toDate));
if (userType == null) {
properties.put("reportType", "System Total");
}
else {
properties.put("reportType", userType);
}
properties.put("shift", "All");
properties.put("centre", terminal == null ? "ALL" : terminal.getName());
properties.put("days", String.valueOf(dateDiff));
properties.put("Capacity", String.valueOf(summary.getCapacity()));
properties.put("GuestCount", String.valueOf(summary.getGuestCount()));
properties.put("GuestPerSeat", Application.formatNumber(summary.getGuestPerCheck()));
properties.put("TableTrnOvr", Application.formatNumber(summary.getTableTurnOver()));
properties.put("AVGGuest", Application.formatNumber(summary.getAvgGuest()));
properties.put("OpenChecks", String.valueOf(summary.getOpenChecks()));
properties.put("VOIDChecks", String.valueOf(summary.getVoidChecks()));
properties.put("OPPDChecks", String.valueOf(" "));
properties.put("TRNGChecks", String.valueOf(" "));
properties.put("ROPNChecks", String.valueOf(summary.getRopnChecks()));
properties.put("MergeChecks", String.valueOf(" "));
properties.put("LaborHour", Application.formatNumber(summary.getLaborHour()));
properties.put("LaborSales", Application.formatNumber(summary.getGrossSale()));
properties.put("Tables", String.valueOf(summary.getTables()));
properties.put("CheckCount", String.valueOf(summary.getCheckCount()));
properties.put("GuestPerChecks", Application.formatNumber(summary.getGuestPerCheck()));
properties.put("TrnOvrTime", String.valueOf(" "));
properties.put("AVGChecks", Application.formatNumber(summary.getAvgCheck()));
properties.put("OPENAmount", Application.formatNumber(summary.getOpenAmount()));
properties.put("VOIDAmount", Application.formatNumber(summary.getVoidAmount()));
properties.put("PAIDChecks", String.valueOf(summary.getPaidChecks()));
properties.put("TRNGAmount", String.valueOf(" "));
properties.put("ROPNAmount", Application.formatNumber(summary.getRopnAmount()));
properties.put("NTaxChecks", String.valueOf(summary.getNtaxChecks()));
properties.put("NTaxAmount", Application.formatNumber(summary.getNtaxAmount()));
properties.put("MergeAmount", String.valueOf(" "));
properties.put("Labor", Application.formatNumber(summary.getLaborCost()));
properties.put("LaborCost", Application.formatNumber((summary.getLaborCost() / summary.getGrossSale()) * 100));
JasperReport report = (JasperReport) JRLoader.loadObject(getClass().getResource("/com/floreantpos/ui/report/sales_summary_report1.jasper"));
JasperPrint print = JasperFillManager.fillReport(report, properties, new JRTableModelDataSource(new ShiftwiseDataTableModel(summary.getSalesTableDataList())));
openReport(print);
}
private void openReport(JasperPrint print) {
JRViewer viewer = new JRViewer(print);
reportPanel.removeAll();
reportPanel.add(viewer);
reportPanel.revalidate();
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btnGo;
private javax.swing.JComboBox cbTerminal;
private javax.swing.JComboBox cbUserType;
private org.jdesktop.swingx.JXDatePicker fromDatePicker;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JSeparator jSeparator1;
private javax.swing.JPanel reportPanel;
private org.jdesktop.swingx.JXDatePicker toDatePicker;
// End of variables declaration//GEN-END:variables
private SimpleDateFormat fullDateFormatter = new SimpleDateFormat("yyyy MMM dd, hh:mm a");
private SimpleDateFormat shortDateFormatter = new SimpleDateFormat("yyyy MMM dd");
private Date fromDate;
private Date toDate;
private int dateDiff;
private UserType userType;
private Terminal terminal;
public int getReportType() {
return reportType;
}
public void setReportType(int reportType) {
this.reportType = reportType;
}
}