/* * 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.domain; import net.rrm.ehour.util.EhourConstants; import org.apache.commons.lang.builder.CompareToBuilder; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; import org.apache.commons.lang.builder.ToStringBuilder; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; import org.hibernate.annotations.Type; import javax.persistence.*; import javax.validation.constraints.NotNull; import java.util.Date; @Entity @Table(name = "PROJECT_ASSIGNMENT") @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) public class ProjectAssignment extends DomainObject<Integer, ProjectAssignment> { private static final long serialVersionUID = -2396783805401137165L; @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "ASSIGNMENT_ID") private Integer assignmentId; @ManyToOne @JoinColumn(name = "USER_ID") @NotNull private User user; @ManyToOne @JoinColumn(name = "PROJECT_ID") @NotNull private Project project; @Column(name = "HOURLY_RATE") private Float hourlyRate; @Column(name = "DATE_START") private Date dateStart; @Column(name = "DATE_END") private Date dateEnd; @Column(name = "ROLE", length = 255) private String role; @ManyToOne @JoinColumn(name = "ASSIGNMENT_TYPE_ID") @NotNull private ProjectAssignmentType assignmentType; @Column(name = "ALLOTTED_HOURS") private Float allottedHours; @Column(name = "ALLOTTED_HOURS_OVERRUN") private Float allowedOverrun; @Column(name = "NOTIFY_PM_ON_OVERRUN") @Type(type = "yes_no") private Boolean notifyPm = Boolean.FALSE; @Column(name = "ACTIVE", nullable = false) @Type(type = "yes_no") private Boolean active; @Transient private boolean deletable; // Constructors /** * default constructor */ public ProjectAssignment() { } public ProjectAssignment(Integer assignmentId) { this.assignmentId = assignmentId; } /** * minimal constructor */ public ProjectAssignment(User user, Project project) { this.user = user; this.project = project; } public ProjectAssignment(User user, Project project, Float hourlyRate) { this(user, project); this.hourlyRate = hourlyRate; } /** * Create a project assignment with default values (date assignment, no start/end date, active)s * * @param project * @param user * @return */ public static ProjectAssignment createProjectAssignment(Project project, User user) { ProjectAssignment assignment = new ProjectAssignment(); assignment.setAssignmentType(new ProjectAssignmentType(EhourConstants.ASSIGNMENT_DATE)); assignment.setProject(project); assignment.setUser(user); assignment.setActive(true); return assignment; } /** * Create a copy of the provided template assignment, replacing the user with the given user */ public static ProjectAssignment createProjectAssignment(ProjectAssignment templateAssignment, User user) { ProjectAssignment assignment = createProjectAssignment(templateAssignment); assignment.setUser(user); return assignment; } /** * Create a copy of the provided template assignment, replacing the project with the given project */ public static ProjectAssignment createProjectAssignment(ProjectAssignment templateAssignment, Project project) { ProjectAssignment assignment = createProjectAssignment(templateAssignment); assignment.setProject(project); return assignment; } private static ProjectAssignment createProjectAssignment(ProjectAssignment templateAssignment) { ProjectAssignment assignment = new ProjectAssignment(); assignment.setActive(templateAssignment.isActive()); assignment.setAllottedHours(templateAssignment.getAllottedHours()); assignment.setAllowedOverrun(templateAssignment.getAllowedOverrun()); assignment.setAssignmentType(templateAssignment.getAssignmentType()); assignment.setDateEnd(templateAssignment.getDateEnd()); assignment.setDateStart(templateAssignment.getDateStart()); assignment.setHourlyRate(templateAssignment.getHourlyRate()); assignment.setNotifyPm(templateAssignment.isNotifyPm()); assignment.setProject(templateAssignment.getProject()); assignment.setRole(templateAssignment.getRole()); assignment.setUser(templateAssignment.getUser()); return assignment; } public boolean isNew() { return getPK() == null; } @Override public String getFullName() { return getProject().getFullName(); } public Integer getAssignmentId() { return this.assignmentId; } public void setAssignmentId(Integer assignmentId) { this.assignmentId = assignmentId; } public User getUser() { return this.user; } public void setUser(User user) { this.user = user; } public Project getProject() { return this.project; } public void setProject(Project project) { this.project = project; } public Float getHourlyRate() { return this.hourlyRate; } public void setHourlyRate(Float hourlyRate) { this.hourlyRate = hourlyRate; } public Date getDateStart() { return this.dateStart; } public void setDateStart(Date dateStart) { this.dateStart = dateStart; } public Date getDateEnd() { return this.dateEnd; } public void setDateEnd(Date dateEnd) { this.dateEnd = dateEnd; } public String getRole() { return this.role; } public void setRole(String description) { this.role = description; } public String toString() { return new ToStringBuilder(this).append("assignmentId", getAssignmentId()) .append("active", isActive()) .append("project", getProject()) .append("user", getUser()) // .append("type", getAssignmentType()) .append("dateStart", getDateStart()) .append("dateEnd", getDateEnd()) .toString(); } /** * @see java.lang.Comparable#compareTo(Object) */ public int compareTo(ProjectAssignment object) { return new CompareToBuilder() //sort by column order as displayed in ProjectOverviewPanel .append(this.getProject().getCustomer().getName(), object.getProject().getCustomer().getName()) .append(this.getProject().getProjectCode(), object.getProject().getProjectCode()) .append(this.getProject().getName(), object.getProject().getName()) //here we should already have a sort. Anyway let's continue with some default comparison .append(this.getProject(), object.getProject()) .append(this.getDateEnd(), object.getDateEnd()) .append(this.getDateStart(), object.getDateStart()) .append(this.getUser(), object.getUser()) .append(this.getAssignmentId(), object.getAssignmentId()) .toComparison(); } public boolean isDeletable() { return deletable; } public void setDeletable(boolean deletable) { this.deletable = deletable; } /** * @return the active */ public boolean isActive() { return active != null && active; } /** * Whether assignment/project/customer are all active * * @return */ public boolean isBookable() { return isActive() && (getProject() == null || getProject().isActive()) && (getProject() == null || getProject().getCustomer() == null || getProject().getCustomer().isActive()); } /** * @param active the active to set */ public void setActive(boolean active) { this.active = active; } @Override public Integer getPK() { return assignmentId; } /** * @return the allottedHours */ public Float getAllottedHours() { return allottedHours; } /** * @param allottedHours the allottedHours to set */ public void setAllottedHours(Float allottedHours) { this.allottedHours = allottedHours; } /** * @return the assignmentType */ public ProjectAssignmentType getAssignmentType() { return assignmentType; } /** * @param assignmentType the assignmentType to set */ public void setAssignmentType(ProjectAssignmentType assignmentType) { this.assignmentType = assignmentType; } /** * @return the allowedOverrun */ public Float getAllowedOverrun() { return allowedOverrun; } /** * @param allowedOverrun the allowedOverrun to set */ public void setAllowedOverrun(Float allowedOverrun) { this.allowedOverrun = allowedOverrun; } /** * @return the notifyPm */ public boolean isNotifyPm() { return notifyPm; } /** * @param notifyPm the notifyPm to set */ public void setNotifyPm(boolean notifyPm) { this.notifyPm = notifyPm; } @Override public boolean equals(final Object other) { if (!(other instanceof ProjectAssignment)) { return false; } ProjectAssignment castOther = (ProjectAssignment) other; return new EqualsBuilder() .append(user, castOther.user) .append(project, castOther.project) .append(hourlyRate, castOther.hourlyRate) .append(dateStart, castOther.dateStart) .append(dateEnd, castOther.dateEnd) .append(role, castOther.role) .append(assignmentType, castOther.assignmentType) .append(allottedHours, castOther.allottedHours) .append(allowedOverrun, castOther.allowedOverrun) .append(active, castOther.active) .append(getPK(), castOther.getPK()) .isEquals(); } @Override public int hashCode() { return new HashCodeBuilder() .append(user) .append(project) .append(hourlyRate) .append(dateStart) .append(dateEnd) .append(role) .append(assignmentType) .append(allottedHours) .append(allowedOverrun) .append(active) .append(assignmentId) .toHashCode(); } }