package com.floreantpos.ui.report;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import org.jdesktop.swingx.calendar.DateUtils;
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.JRViewer;
import com.floreantpos.main.Application;
import com.floreantpos.model.Ticket;
import com.floreantpos.model.TicketItem;
import com.floreantpos.model.TicketItemModifier;
import com.floreantpos.model.TicketItemModifierGroup;
import com.floreantpos.model.dao.TicketDAO;
import com.floreantpos.report.ReportItem;
import com.floreantpos.report.SalesReportModel;
import com.floreantpos.report.SalesReportModelFactory;
import com.floreantpos.report.services.ReportService;
public class SalesReport extends Report {
private SalesReportModel itemReportModel;
private SalesReportModel modifierReportModel;
public SalesReport() {
super();
}
@Override
public void refresh() throws Exception {
createModels();
SalesReportModel itemReportModel = this.itemReportModel;
SalesReportModel modifierReportModel = this.modifierReportModel;
JasperReport itemReport = (JasperReport) JRLoader.loadObject(SalesReportModelFactory.class.getResource("/com/floreantpos/ui/report/sales_sub_report.jasper"));
JasperReport modifierReport = (JasperReport) JRLoader.loadObject(SalesReportModelFactory.class.getResource("/com/floreantpos/ui/report/sales_sub_report.jasper"));
HashMap map = new HashMap();
ReportUtil.populateRestaurantProperties(map);
map.put("reportTitle", "================================= Sales Report ================================");
map.put("reportTime", ReportService.formatFullDate(new Date()));
map.put("dateRange", ReportService.formatShortDate(getStartDate()) + " to " + ReportService.formatShortDate(getEndDate()));
map.put("terminalName", "All");
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(SalesReport.class.getResource("/com/floreantpos/ui/report/sales_report.jasper"));
JasperPrint print = JasperFillManager.fillReport(masterReport, map, new JREmptyDataSource());
viewer = new JRViewer(print);
}
@Override
public boolean isDateRangeSupported() {
return true;
}
@Override
public boolean isTypeSupported() {
return true;
}
public void createModels() {
Date date1 = DateUtils.startOfDay(getStartDate());
Date date2 = DateUtils.endOfDay(getEndDate());
List<Ticket> tickets = TicketDAO.getInstance().findTickets(date1, date2, getReportType() == Report.REPORT_TYPE_1 ? true : false);
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.getTicketItemModifierGroups() != null) {
List<TicketItemModifierGroup> ticketItemModifierGroups = ticketItem.getTicketItemModifierGroups();
for (TicketItemModifierGroup ticketItemModifierGroup : ticketItemModifierGroups) {
List<TicketItemModifier> modifiers = ticketItemModifierGroup.getTicketItemModifiers();
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.getUnitPrice());
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();
}
}