package com.floreantpos.report;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import net.sf.jasperreports.engine.JREmptyDataSource;
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.JasperViewer;
import org.jdesktop.swingx.calendar.DateUtils;
import com.floreantpos.main.Application;
import com.floreantpos.model.Ticket;
import com.floreantpos.model.TicketItem;
import com.floreantpos.model.dao.TicketDAO;
public class SalesReportModelFactory {
private Date startDate;
private Date endDate;
private boolean settled = true;
private SalesReportModel itemReportModel;
private SalesReportModel modifierReportModel;
public SalesReportModelFactory() {
super();
}
public void createModels() {
Date currentDate = new Date();
if(startDate == null) {
startDate = DateUtils.startOfDay(currentDate);
}
if(endDate == null) {
endDate = DateUtils.endOfDay(currentDate);
}
List<Ticket> tickets = TicketDAO.getInstance().findTickets(startDate, endDate, settled);
HashMap<String, ReportItem> itemMap = new HashMap<String, ReportItem>();
HashMap<String, ReportItem> modifierMap = new HashMap<String, ReportItem>();
for (Iterator iter = tickets.iterator(); iter.hasNext();) {
Ticket ticket = (Ticket) iter.next();
ticket = TicketDAO.getInstance().initializeTicket(ticket);
List<TicketItem> ticketItems = ticket.getTicketItems();
if(ticketItems == null) continue;
String key = null;
for (TicketItem ticketItem : ticketItems) {
if(ticketItem.getItemId() == null) {
key = ticketItem.getName();
}
else {
key = ticketItem.getItemId().toString();
}
ReportItem reportItem = itemMap.get(key);
if(reportItem == null) {
reportItem = new ReportItem();
reportItem.setId(key);
reportItem.setPrice(ticketItem.getUnitPrice());
reportItem.setName(ticketItem.getName());
reportItem.setTaxRate(ticketItem.getTaxRate());
itemMap.put(key, reportItem);
}
reportItem.setQuantity(ticketItem.getItemCount() + reportItem.getQuantity());
reportItem.setTotal(reportItem.getTotal() + ticketItem.getSubtotalAmountWithoutModifiers());
// if(ticketItem.isHasModifiers() && ticketItem.getModifiers() != null && ticketItem.getModifiers().size() > 0) {
// List<TicketItemModifier> modifiers = ticketItem.getModifiers();
// for (TicketItemModifier modifier : modifiers) {
// if(modifier.getItemId() == null) {
// key = modifier.getName();
// }
// else {
// key = modifier.getItemId().toString();
// }
// ReportItem modifierReportItem = modifierMap.get(key);
// if(modifierReportItem == null) {
// modifierReportItem = new ReportItem();
// modifierReportItem.setId(key);
// modifierReportItem.setPrice(modifier.getPrice());
// modifierReportItem.setName(modifier.getName());
// modifierReportItem.setTaxRate(modifier.getTaxRate());
//
// modifierMap.put(key, modifierReportItem);
// }
// modifierReportItem.setQuantity(modifierReportItem.getQuantity() + 1);
// modifierReportItem.setTotal(modifierReportItem.getTotal() + modifier.getTotal());
// }
// }
}
ticket = null;
iter.remove();
}
itemReportModel = new SalesReportModel();
itemReportModel.setItems(new ArrayList<ReportItem>(itemMap.values()));
itemReportModel.calculateGrandTotal();
modifierReportModel = new SalesReportModel();
modifierReportModel.setItems(new ArrayList<ReportItem>(modifierMap.values()));
modifierReportModel.calculateGrandTotal();
}
public static void main(String[] args) throws Exception {
SalesReportModelFactory factory = new SalesReportModelFactory();
factory.createModels();
SalesReportModel itemReportModel = factory.getItemReportModel();
SalesReportModel modifierReportModel = factory.getModifierReportModel();
JasperReport itemReport = (JasperReport) JRLoader.loadObject(SalesReportModelFactory.class.getResource("/com/floreantpos/ui/report/SalesSubReport.jasper"));
JasperReport modifierReport = (JasperReport) JRLoader.loadObject(SalesReportModelFactory.class.getResource("/com/floreantpos/ui/report/SalesSubReport.jasper"));
HashMap map = new HashMap();
map.put("itemDataSource", new JRTableModelDataSource(itemReportModel));
map.put("modifierDataSource", new JRTableModelDataSource(modifierReportModel));
map.put("currencySymbol", Application.getCurrencySymbol());
map.put("itemGrandTotal", itemReportModel.getGrandTotalAsString());
map.put("modifierGrandTotal", modifierReportModel.getGrandTotalAsString());
map.put("itemReport", itemReport);
map.put("modifierReport", modifierReport);
JasperReport masterReport = (JasperReport) JRLoader.loadObject(SalesReportModelFactory.class.getResource("/com/floreantpos/ui/report/SalesReport.jasper"));
JasperPrint print = JasperFillManager.fillReport(masterReport, map, new JREmptyDataSource());
JasperViewer.viewReport(print, false);
}
public Date getEndDate() {
return endDate;
}
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
public boolean isSettled() {
return settled;
}
public void setSettled(boolean settled) {
this.settled = settled;
}
public Date getStartDate() {
return startDate;
}
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
public SalesReportModel getItemReportModel() {
return itemReportModel;
}
public SalesReportModel getModifierReportModel() {
return modifierReportModel;
}
}