/*
* 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.excel.part;
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.ui.common.report.Report;
import net.rrm.ehour.ui.common.report.excel.CellFactory;
import net.rrm.ehour.ui.common.report.excel.ExcelStyle;
import net.rrm.ehour.ui.common.report.excel.ExcelWorkbook;
import net.rrm.ehour.util.DateUtil;
import org.apache.commons.collections.CollectionUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;
import java.util.*;
/**
* Created on Mar 25, 2009, 6:35:04 AM
*
* @author Thies Edeling (thies@te-con.nl)
*/
public class ExportReportBody extends AbstractExportReportPart {
public ExportReportBody(int cellMargin, Sheet sheet, Report report, ExcelWorkbook workbook) {
super(cellMargin, sheet, report, workbook);
}
@Override
public int createPart(int rowNumber) {
Map<Date, List<FlatReportElement>> dateMap = getElementsAsDateMap(getReport());
List<Date> dateSequence = DateUtil.createDateSequence(getReport().getReportRange(), getConfig());
rowNumber = createRowForDateSequence(rowNumber, dateMap, dateSequence);
return rowNumber;
}
private int createRowForDateSequence(int rowNumber, Map<Date, List<FlatReportElement>> dateMap, List<Date> dateSequence) {
for (Date date : dateSequence) {
List<FlatReportElement> flatList = dateMap.get(date);
boolean borderCells = isFirstDayOfWeek(date);
rowNumber = !CollectionUtils.isEmpty(flatList) ? addColumnsToRow(date, flatList, rowNumber, borderCells) : addEmptyRow(rowNumber, date, borderCells);
}
return rowNumber;
}
private boolean isFirstDayOfWeek(Date date) {
Calendar cal = GregorianCalendar.getInstance();
cal.setTime(date);
return cal.get(Calendar.DAY_OF_WEEK) == getConfig().getFirstDayOfWeek();
}
private int addEmptyRow(int rowNumber, Date date, boolean isBorder) {
Row row = getSheet().createRow(rowNumber++);
createDateCell(date, row, isBorder);
if (isBorder) {
ExcelStyle border = ExcelStyle.BORDER_NORTH_THIN;
createEmptyCells(row, border);
CellFactory.createCell(row, getCellMargin() + ExportReportColumn.CUSTOMER_CODE.getColumn(), getWorkbook(), border);
CellFactory.createCell(row, getCellMargin() + ExportReportColumn.PROJECT.getColumn(), getWorkbook(), border);
CellFactory.createCell(row, getCellMargin() + ExportReportColumn.PROJECT_CODE.getColumn(), getWorkbook(), border);
CellFactory.createCell(row, getCellMargin() + ExportReportColumn.HOURS.getColumn(), getWorkbook(), border);
}
return rowNumber;
}
private int addColumnsToRow(Date date, List<FlatReportElement> elements, int rowNumber, boolean isBorder) {
boolean addedForDate = false;
for (FlatReportElement flatReportElement : elements) {
Row row = getSheet().createRow(rowNumber);
if (flatReportElement.getTotalHours() != null && flatReportElement.getTotalHours().doubleValue() >= 0.0) {
createDateCell(date, row, isBorder);
createProjectCell(flatReportElement.getProjectName(), row, isBorder);
createProjectCodeCell(flatReportElement.getProjectCode(), row, isBorder);
createHoursCell(flatReportElement.getTotalHours(), row, isBorder);
createCustomerCodeCell(flatReportElement.getCustomerCode(), row, isBorder);
if (isBorder) {
createEmptyCells(row, ExcelStyle.BORDER_NORTH_THIN);
getSheet().addMergedRegion(new CellRangeAddress(rowNumber, rowNumber, getCellMargin() + 3, getCellMargin() + 5));
}
rowNumber++;
addedForDate = true;
}
}
if (!addedForDate) {
Row row = getSheet().createRow(rowNumber++);
createDateCell(date, row, isBorder);
}
return rowNumber;
}
private Cell createHoursCell(Number hours, Row row, boolean isBorder) {
return CellFactory.createCell(row, getCellMargin() + ExportReportColumn.HOURS.getColumn(), hours, getWorkbook(), (isBorder) ? ExcelStyle.DIGIT_BORDER_NORTH_THIN : ExcelStyle.DIGIT);
}
private Cell createProjectCell(String project, Row row, boolean isBorder) {
return CellFactory.createCell(row, getCellMargin() + ExportReportColumn.PROJECT.getColumn(), project, getWorkbook(), (isBorder) ? ExcelStyle.BORDER_NORTH_THIN : ExcelStyle.NORMAL_FONT);
}
private Cell createProjectCodeCell(String project, Row row, boolean isBorder) {
return CellFactory.createCell(row, getCellMargin() + ExportReportColumn.PROJECT_CODE.getColumn(), project, getWorkbook(), (isBorder) ? ExcelStyle.BORDER_NORTH_THIN : ExcelStyle.NORMAL_FONT);
}
private Cell createCustomerCodeCell(String customerCode, Row row, boolean isBorder) {
return CellFactory.createCell(row, getCellMargin() + ExportReportColumn.CUSTOMER_CODE.getColumn(), customerCode, getWorkbook(), (isBorder) ? ExcelStyle.BORDER_NORTH_THIN : ExcelStyle.NORMAL_FONT);
}
private Cell createDateCell(Date date, Row row, boolean isBorder) {
return CellFactory.createCell(row, getCellMargin() + ExportReportColumn.DATE.getColumn(), getFormatter().format(date), getWorkbook(), (isBorder) ? ExcelStyle.DATE_BORDER_NORTH_THIN : ExcelStyle.DATE);
}
/**
* Return a map with the key being the report's date and a list of a report elements for that date as the value
*/
private Map<Date, List<FlatReportElement>> getElementsAsDateMap(Report report) {
Map<Date, List<FlatReportElement>> flatMap = new TreeMap<>();
ReportData reportData = report.getReportData();
for (ReportElement reportElement : reportData.getReportElements()) {
FlatReportElement flat = (FlatReportElement) reportElement;
Date date = DateUtil.nullifyTime(flat.getDayDate());
List<FlatReportElement> dateElements;
if (flatMap.containsKey(date)) {
dateElements = flatMap.get(date);
} else {
dateElements = new ArrayList<>();
}
dateElements.add(flat);
flatMap.put(date, dateElements);
}
return flatMap;
}
}