* @param showAxisValues
* @return
*/
public JFreeChart create(final TimesheetDao timesheetDao, final Integer userId, final short forLastNDays, final boolean showAxisValues)
{
final DayHolder dh = new DayHolder();
final TimesheetFilter filter = new TimesheetFilter();
filter.setStopTime(dh.getDate());
dh.add(Calendar.DATE, -forLastNDays);
filter.setStartTime(dh.getDate());
filter.setUserId(userId);
filter.setOrderType(OrderDirection.ASC);
final List<TimesheetDO> list = timesheetDao.getList(filter);
final TimeSeries planSeries = new TimeSeries("Soll");
final TimeSeries actualSeries = new TimeSeries("Ist");
final Iterator<TimesheetDO> it = list.iterator();
TimesheetDO current = null;
if (it.hasNext() == true) {
current = it.next();
}
long numberOfBookedDays = 0;
long totalDifference = 0;
for (int i = 0; i <= forLastNDays; i++) {
long difference = 0;
long totalDuration = 0; // Weight for average.
while (current != null && (dh.isSameDay(current.getStartTime()) == true || current.getStartTime().before(dh.getDate()) == true)) {
final long duration = current.getWorkFractionDuration();
difference += (current.getCreated().getTime() - current.getStartTime().getTime()) * duration;
totalDuration += duration;
if (it.hasNext() == true) {
current = it.next();
} else {
current = null;
break;
}
}
final double averageDifference = difference > 0 ? ((double) difference) / totalDuration / 86400000 : 0; // In days.
final Day day = new Day(dh.getDayOfMonth(), dh.getMonth() + 1, dh.getYear());
if (averageDifference > 0) {
planSeries.add(day, PLANNED_AVERAGE_DIFFERENCE_BETWEEN_TIMESHEET_AND_BOOKING); // plan average
// (PLANNED_AVERAGE_DIFFERENCE_BETWEEN_TIMESHEET_AND_BOOKING
// days).
actualSeries.add(day, averageDifference);
totalDifference += averageDifference;
numberOfBookedDays++;
}
dh.add(Calendar.DATE, 1);
}
averageDifferenceBetweenTimesheetAndBooking = numberOfBookedDays > 0 ? new BigDecimal(totalDifference).divide(new BigDecimal(
numberOfBookedDays), 1, RoundingMode.HALF_UP) : BigDecimal.ZERO;
final TimeSeriesCollection dataset = new TimeSeriesCollection();