/*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package net.rrm.ehour.ui.timesheet.export;
import net.rrm.ehour.domain.Project;
import net.rrm.ehour.domain.ProjectAssignment;
import net.rrm.ehour.report.criteria.ReportCriteria;
import net.rrm.ehour.report.reports.ReportData;
import net.rrm.ehour.report.reports.element.FlatReportElement;
import net.rrm.ehour.report.reports.element.ReportElement;
import net.rrm.ehour.report.service.DetailedReportService;
import net.rrm.ehour.sort.ProjectAssignmentComparator;
import net.rrm.ehour.ui.common.report.AbstractReportModel;
import net.rrm.ehour.ui.common.util.WebUtils;
import net.rrm.ehour.util.DateUtil;
import org.apache.log4j.Logger;
import org.apache.wicket.spring.injection.annot.SpringBean;
import java.text.ParseException;
import java.util.*;
import static org.springframework.util.Assert.notNull;
/**
* Print report for printing a timesheet
*/
public class ExcelExportReportModel extends AbstractReportModel {
private static final long serialVersionUID = -8062083697181324496L;
private static final Logger LOGGER = Logger.getLogger(ExcelExportReportModel.class);
@SpringBean
private DetailedReportService detailedReportService;
private transient SortedMap<ProjectAssignment, Map<Date, FlatReportElement>> rowMap;
public ExcelExportReportModel(ReportCriteria criteria) {
super(criteria);
}
protected ProjectAssignment getRowKey(FlatReportElement aggregate) {
ProjectAssignment pa = new ProjectAssignment();
pa.setAssignmentId(aggregate.getAssignmentId());
pa.setRole(aggregate.getRole());
Project prj = new Project();
prj.setName(aggregate.getProjectName());
prj.setProjectId(aggregate.getProjectId());
pa.setProject(prj);
return pa;
}
/**
* Format is ddmmyyyy
*
* @throws ParseException
*/
protected Date getAggregateDate(FlatReportElement aggregate) throws ParseException {
return aggregate.getDayDate();
}
protected Comparator<ProjectAssignment> getRKComparator() {
return new ProjectAssignmentComparator();
}
protected ReportData fetchReportData(ReportCriteria reportCriteria) {
return getDetailedReportService().getDetailedReportData(reportCriteria);
}
private DetailedReportService getDetailedReportService() {
if (detailedReportService == null) {
WebUtils.springInjection(this);
}
return detailedReportService;
}
@Override
protected ReportData getReportData(ReportCriteria reportCriteria) {
Map<Date, FlatReportElement> rowAggregates;
Date aggregateDate;
ProjectAssignment rowKey;
ReportData aggregateData = getValidReportData(reportCriteria);
rowMap = new TreeMap<>(getRKComparator());
for (ReportElement element : aggregateData.getReportElements()) {
FlatReportElement aggregate = (FlatReportElement) element;
rowKey = getRowKey(aggregate);
if (rowMap.containsKey(rowKey)) {
rowAggregates = rowMap.get(rowKey);
} else {
rowAggregates = new HashMap<>();
}
aggregateDate = getValidAggregateDate(aggregate);
aggregateDate = DateUtil.nullifyTime(aggregateDate);
rowAggregates.put(aggregateDate, aggregate);
rowMap.put(rowKey, rowAggregates);
}
return aggregateData;
}
private ReportData getValidReportData(ReportCriteria reportCriteria) {
ReportData reportData = fetchReportData(reportCriteria);
notNull(reportData);
notNull(reportData.getReportElements());
return reportData;
}
/**
* Get grand total hours
*
* @return
*/
public float getGrandTotalHours() {
float total = 0;
Map<Date, FlatReportElement> aggMap;
for (ProjectAssignment key : rowMap.keySet()) {
aggMap = rowMap.get(key);
for (Map.Entry<Date, FlatReportElement> entry : aggMap.entrySet()) {
Number n = entry.getValue().getTotalHours();
if (n != null) {
total += n.floatValue();
}
}
}
return total;
}
/**
* Get the values
*
* @return
*/
public SortedMap<ProjectAssignment, Map<Date, FlatReportElement>> getValues() {
if (rowMap == null) {
lazyInitRowMap();
}
return rowMap;
}
private void lazyInitRowMap() {
load();
}
private Date getValidAggregateDate(FlatReportElement aggregate) {
Date date;
try {
date = getAggregateDate(aggregate);
} catch (ParseException e) {
LOGGER.warn("failed to parse date of " + aggregate, e);
date = new Date();
}
return date;
}
/*
* (non-Javadoc)
* @see org.apache.wicket.model.LoadableDetachableModel#onDetach()
*/
@Override
protected void onDetach() {
rowMap = null;
}
}