/*
* 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 org.apache.commons.lang.StringUtils;
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.HashSet;
import java.util.Set;
@Entity
@Table(name = "PROJECT")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Project extends DomainObject<Integer, Project> {
private static final long serialVersionUID = 6553709211219335091L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "PROJECT_ID")
private Integer projectId;
@Column(name = "PROJECT_CODE", length = 32, nullable = false)
@NotNull
private String projectCode;
@Column(name = "CONTACT", length = 255)
private String contact;
@Column(name = "DESCRIPTION", length = 1024)
private String description;
@Column(name = "NAME", length = 255, nullable = false)
@NotNull
private String name;
@Column(name = "DEFAULT_PROJECT")
@Type(type = "yes_no")
private Boolean defaultProject = Boolean.FALSE;
@Column(name = "ACTIVE")
@Type(type = "yes_no")
private Boolean active = Boolean.TRUE;
@ManyToOne
@JoinColumn(name = "CUSTOMER_ID", nullable = true)
@NotNull
private Customer customer;
@OneToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE}, mappedBy = "project")
@Basic(fetch = FetchType.LAZY)
private Set<ProjectAssignment> projectAssignments;
@ManyToOne
@JoinColumn(name = "PROJECT_MANAGER", nullable = true)
private User projectManager;
@Column(name = "BILLABLE")
@Type(type = "yes_no")
private Boolean billable = Boolean.TRUE;
@Transient
private Double bookedHours;
// Constructors
public boolean isBillable() {
return billable;
}
public void setBillable(boolean billable) {
this.billable = billable;
}
/**
* default constructor
*/
public Project() {
}
public Project(Integer projectId) {
this.projectId = projectId;
}
public Project(Integer projectId, Customer customer) {
this(projectId);
this.customer = customer;
}
public String getFullName() {
return (StringUtils.isBlank(projectCode)) ? name : projectCode + " - " + name;
}
public String getFullNameWithCustomer() {
return getCustomer().getCode() + ": " + ((StringUtils.isBlank(projectCode)) ? name : projectCode + " - " + name);
}
/**
* Get primary key
*/
public Integer getPK() {
return projectId;
}
// Property accessors
public Integer getProjectId() {
return this.projectId;
}
public void setProjectId(Integer projectId) {
this.projectId = projectId;
}
public String getProjectCode() {
return this.projectCode;
}
public void setProjectCode(String projectCode) {
this.projectCode = projectCode;
}
public String getContact() {
return this.contact;
}
public void setContact(String contact) {
this.contact = contact;
}
public String getDescription() {
return this.description;
}
public void setDescription(String description) {
this.description = description;
}
public String getName() {
return this.name;
}
public Project setName(String name) {
this.name = name;
return this;
}
public boolean isDefaultProject() {
return this.defaultProject;
}
public void setDefaultProject(boolean defaultProject) {
this.defaultProject = defaultProject;
}
public Customer getCustomer() {
return this.customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
/**
* @return the active
*/
public boolean isActive() {
return active;
}
/**
* @param active the active to set
*/
public void setActive(boolean active) {
this.active = active;
}
/**
* @return the projectAssignments
*/
public Set<ProjectAssignment> getProjectAssignments() {
return projectAssignments;
}
/**
* @param projectAssignments the projectAssignments to set
*/
public void setProjectAssignments(Set<ProjectAssignment> projectAssignments) {
this.projectAssignments = projectAssignments;
}
/**
* @see java.lang.Comparable#compareTo(Object)
*/
public int compareTo(Project object) {
return new CompareToBuilder()
.append(this.getName(), object.getName())
.append(this.getProjectCode(), object.getProjectCode())
.append(this.getCustomer(), object.getCustomer())
.append(this.getProjectId(), object.getProjectId()).toComparison();
}
/**
* @return the projectManager
*/
public User getProjectManager() {
return projectManager;
}
/**
* @param projectManager the projectManager to set
*/
public void setProjectManager(User projectManager) {
this.projectManager = projectManager;
}
/**
* @see java.lang.Object#toString()
*/
public String toString() {
return new ToStringBuilder(this).append("active", this.active)
.append("PK", this.getPK())
.append("defaultProject", this.defaultProject)
.append("fullname", this.getFullName())
.append("projectCode", this.getProjectCode())
.append("name", this.getName())
.append("projectId", this.getProjectId())
.append("billable", this.isBillable())
.append("pm", this.getProjectManager())
.toString();
}
/**
* @return the deletable
*/
public boolean isDeletable() {
return !(bookedHours != null && bookedHours > 0);
}
public void addProjectAssignment(ProjectAssignment assignment) {
if (projectAssignments == null) {
projectAssignments = new HashSet<>();
}
projectAssignments.add(assignment);
}
@Override
public boolean equals(final Object other) {
if (!(other instanceof Project)) {
return false;
}
Project castOther = (Project) other;
return new EqualsBuilder().append(projectCode, castOther.projectCode).append(contact, castOther.contact).append(description, castOther.description).append(name, castOther.name).append(defaultProject, castOther.defaultProject).append(active, castOther.active).append(
customer, castOther.customer).append(billable, castOther.billable).isEquals();
}
@Override
public int hashCode() {
return new HashCodeBuilder().append(projectCode).append(contact).append(description).append(name).append(defaultProject).append(active).append(customer).append(billable).toHashCode();
}
public void setBookedHours(Double bookedHours) {
this.bookedHours = bookedHours;
}
public Double getBookedHours() {
return bookedHours;
}
}