/* * 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.dto; import net.rrm.ehour.config.EhourConfig; import net.rrm.ehour.domain.ProjectAssignment; import net.rrm.ehour.domain.TimesheetEntry; import net.rrm.ehour.domain.TimesheetEntryId; import net.rrm.ehour.project.status.ProjectAssignmentStatus; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; import org.apache.wicket.Application; import org.apache.wicket.Localizer; import org.apache.wicket.model.Model; import java.io.Serializable; import java.util.ArrayList; import java.util.Calendar; import java.util.List; /** * Representation of a row in the timesheet form **/ public class TimesheetRow implements Serializable { private static final long serialVersionUID = -5800367771424869244L; private ProjectAssignment projectAssignment; private TimesheetCell[] timesheetCells; private Calendar firstDayOfWeekDate; private Timesheet timesheet; // parent timesheet private ProjectAssignmentStatus assignmentStatus; private EhourConfig config; public TimesheetRow(EhourConfig config) { this.config= config; } /** * @return the config */ public EhourConfig getConfig() { return config; } /** * @param config the config to set */ public void setConfig(EhourConfig config) { this.config = config; } /** * @return the assignmentStatus */ public ProjectAssignmentStatus getAssignmentStatus() { return assignmentStatus; } /** * @param assignmentStatus the assignmentStatus to set */ public void setAssignmentStatus(ProjectAssignmentStatus assignmentStatus) { this.assignmentStatus = assignmentStatus; } /** * Get status * @return */ public String getStatus() { if (assignmentStatus != null && assignmentStatus.getAggregate() != null && assignmentStatus.getAggregate().getAvailableHours() != null && assignmentStatus.getAggregate().getAvailableHours().or(0f) < 0) { AvailableHours hours = new AvailableHours((int) (getAssignmentStatus().getAggregate().getAvailableHours().or(0f) * -1)); Localizer localizer = Application.get().getResourceSettings().getLocalizer(); return localizer.getString("timesheet.errorNoHours", null, new Model<>(hours)); } return "<br />"; } public void bookRemainingHoursOnRow() { // only for monday - friday for (int day = 1; day <= 5; day++) { float remaining = timesheet.getRemainingHoursForDay(day); if (remaining > 0) { TimesheetEntry entry = timesheetCells[day].getTimesheetEntry(); if (entry == null) { entry = new TimesheetEntry(); } if (entry.getHours() == null) { entry.setHours(remaining); } else { entry.setHours(entry.getHours() + remaining); } timesheetCells[day].setTimesheetEntry(entry); } } } /** * @return the projectAssignment */ public ProjectAssignment getProjectAssignment() { return projectAssignment; } /** * @param projectAssignment the projectAssignment to set */ public void setProjectAssignment(ProjectAssignment projectAssignment) { this.projectAssignment = projectAssignment; } /** * @return the timesheetCells */ public TimesheetCell[] getTimesheetCells() { return timesheetCells; } /** * @param timesheetCells the timesheetCells to set */ public void setTimesheetCells(TimesheetCell[] timesheetCells) { this.timesheetCells = timesheetCells; } /** * Add timesheet cell on specific location * @param dayInWeek * @param cell */ public void addTimesheetCell(int dayInWeek, TimesheetCell cell) { if (timesheetCells == null) { timesheetCells = new TimesheetCell[7]; } if (dayInWeek > timesheetCells.length) { throw new IllegalArgumentException("Trying to insert more than 7 days in a week: " + dayInWeek); } timesheetCells[dayInWeek] = cell; } /** * Get all timesheet entries contained in this row * @return */ public List<TimesheetEntry> getTimesheetEntries() { List<TimesheetEntry> entries = new ArrayList<>(); if (timesheetCells != null) { for (TimesheetCell timesheetCell : timesheetCells) { // as timesheet entry is lazy fetched in a subsequent http requests, assignment is not set if (timesheetCell != null && timesheetCell.getTimesheetEntry() != null) { // new entries got empty entry id if (timesheetCell.getTimesheetEntry().getEntryId() == null) { TimesheetEntryId id = new TimesheetEntryId(); id.setProjectAssignment(getProjectAssignment()); id.setEntryDate(timesheetCell.getDate()); timesheetCell.getTimesheetEntry().setEntryId(id); } else { timesheetCell.getTimesheetEntry().getEntryId().setProjectAssignment(getProjectAssignment()); } entries.add(timesheetCell.getTimesheetEntry()); } } } return entries; } /** * @return the firstDayOfWeekDate */ public Calendar getFirstDayOfWeekDate() { return firstDayOfWeekDate; } /** * @param firstDayOfWeekDate the firstDayOfWeekDate to set */ public void setFirstDayOfWeekDate(Calendar firstDayOfWeekDate) { this.firstDayOfWeekDate = firstDayOfWeekDate; } public Timesheet getTimesheet() { return timesheet; } public void setTimesheet(Timesheet timesheet) { this.timesheet = timesheet; } @SuppressWarnings("serial") private static class AvailableHours implements Serializable { int hours; public AvailableHours(int hours) { this.hours = hours; } // reflection @SuppressWarnings("unused") public int getHours() { return hours; } } @Override public boolean equals(final Object other) { if (!(other instanceof TimesheetRow)) { return false; } TimesheetRow castOther = (TimesheetRow) other; return new EqualsBuilder() .append(projectAssignment, castOther.projectAssignment) .isEquals(); } @Override public int hashCode() { return new HashCodeBuilder() .append(projectAssignment) .toHashCode(); } }