package hu.sch.domain;
import hu.sch.domain.enums.ValuationStatus;
import hu.sch.domain.user.User;
import java.io.Serializable;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.PrePersist;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import javax.persistence.Version;
/**
*
* @author hege
*/
@Entity
@Table(name = "ertekelesek")
@NamedQueries({
@NamedQuery(name = Valuation.findForDetails,
query = "SELECT v FROM Valuation v "
+ "LEFT JOIN FETCH v.sender "
+ "LEFT JOIN FETCH v.consideredBy "
+ "WHERE v.id = :id"),
@NamedQuery(name = Valuation.findBySemesterAndGroup,
query = "SELECT v FROM Valuation v WHERE v.semester=:semester "
+ "AND v.group=:group AND v.nextVersion IS NULL"),
@NamedQuery(name = Valuation.findIdBySemesterAndGroup,
query = "SELECT v.id FROM Valuation v WHERE v.semester=:semester "
+ "AND v.group=:group AND v.nextVersion IS NULL"),
@NamedQuery(name = Valuation.findByGroup,
query = "SELECT v FROM Valuation v "
+ "WHERE v.group=:group AND v.nextVersion IS NULL "
+ "ORDER BY v.semester DESC"),
@NamedQuery(name = Valuation.delete, query = "DELETE FROM Valuation v WHERE v.group = :group AND v.semester = :semester"),
@NamedQuery(name = Valuation.findStatisticBySemester, query = Valuation.statQuery + "WHERE v.semester = :semester AND v.nextVersion IS NULL"),
@NamedQuery(name = Valuation.findStatisticBySemesterAndGroup, query = Valuation.statQuery + "WHERE v.semester = :semester AND v.group = :group ORDER BY v.id DESC"),
@NamedQuery(name = Valuation.findStatisticByValuation, query = Valuation.statQuery + "WHERE v.id = :valuationId"),
@NamedQuery(name = Valuation.findStatisticByValuations, query = Valuation.statQuery + "WHERE v.id in (:ids)"),
@NamedQuery(name = Valuation.findStatisticBySemesterAndStatuses, query = Valuation.statQuery
+ "WHERE v.semester=:semester AND (v.pointStatus=:pointStatus OR v.entrantStatus=:entrantStatus)")
})
public class Valuation implements Serializable {
public static final String findForDetails = "findForDetails";
public static final String findBySemesterAndGroup = "findValuationBySemesterAndGroup";
public static final String findIdBySemesterAndGroup = "findValuationIdBySemesterAndGroup";
public static final String findByGroup = "findValuationByGroup";
public static final String findStatisticByValuation = "findStatisticForValuation";
public static final String findStatisticByValuations = "findStatisticForValuations";
public static final String findStatisticBySemester = "findStatisticBySemester";
public static final String findStatisticBySemesterAndGroup = "findStatisticBySemesterAndGroup";
public static final String findStatisticBySemesterAndStatuses = "findStatisticBySemesterAndStatuses";
public static final String delete = "delete";
protected static final String statQuery = "SELECT new hu.sch.domain.ValuationStatistic(v, "
+ "(SELECT avg(p.point) FROM PointRequest p WHERE p.valuation = v AND p.point > 0) as averagePoint, "
+ "(SELECT sum(p.point) FROM PointRequest p WHERE p.valuation = v AND p.point > 0) as summaPoint, "
+ "(SELECT count(*) as numKDO FROM EntrantRequest as e WHERE e.valuation = v AND e.entrantType=\'KDO\') as givenKDO, "
+ "(SELECT count(*) as numKB FROM EntrantRequest as e WHERE e.valuation = v AND e.entrantType=\'KB\') as givenKB, "
+ "(SELECT count(*) as numAB FROM EntrantRequest as e WHERE e.valuation = v AND e.entrantType=\'AB\') as givenAB"
+ ") FROM Valuation v ";
//----------------------------------------------------
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
protected Long id;
//----------------------------------------------------
@OneToOne
@JoinColumn(name = "next_version")
protected Valuation nextVersion;
//----------------------------------------------------
@ManyToOne
@JoinColumn(name = "grp_id")
protected Group group;
//----------------------------------------------------
@Column(name = "grp_id", insertable = false, updatable = false)
protected Long groupId;
//----------------------------------------------------
@ManyToOne(optional = true)
@JoinColumn(name = "felado_usr_id")
protected User sender;
//----------------------------------------------------
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "feladas")
protected Date sended;
//----------------------------------------------------
@Column(name = "szoveges_ertekeles", columnDefinition = "text", length = 4096, nullable = false)
@Basic(fetch = FetchType.LAZY)
protected String valuationText;
//----------------------------------------------------
@Column(name = "pontozasi_elvek", columnDefinition = "text", nullable = false)
protected String principle;
//----------------------------------------------------
@Enumerated(EnumType.STRING)
@Column(name = "pontigeny_statusz")
protected ValuationStatus pointStatus;
//----------------------------------------------------
@Enumerated(EnumType.STRING)
@Column(name = "belepoigeny_statusz")
protected ValuationStatus entrantStatus;
//----------------------------------------------------
@Embedded
protected Semester semester;
//----------------------------------------------------
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "utolso_modositas")
protected Date lastModified;
//----------------------------------------------------
@ManyToOne(optional = true, fetch = FetchType.LAZY)
@JoinColumn(name = "elbiralo_usr_id")
protected User consideredBy;
//----------------------------------------------------
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "utolso_elbiralas")
protected Date lastConsidered;
//----------------------------------------------------
@Column(name = "explanation", columnDefinition = "text", nullable = false)
protected String explanation;
//----------------------------------------------------
@OneToMany(mappedBy = "valuation", fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
protected Set<EntrantRequest> entrantRequestsAsSet;
//----------------------------------------------------
@OneToMany(mappedBy = "valuation", fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
protected Set<PointRequest> pointRequestsAsSet;
//----------------------------------------------------
@Transient
protected Float averagePoint;
//----------------------------------------------------
@Version
@Column(name = "optlock")
protected int optLock;
//----------------------------------------------------
@Column(name = "is_considered")
protected boolean considered;
@PrePersist
protected void setDefaultValues() {
if (sended == null) {
setSended(new Date());
}
if (lastModified == null) {
setLastModified(new Date());
}
if (pointStatus == null) {
setPointStatus(ValuationStatus.NINCS);
}
if (entrantStatus == null) {
setEntrantStatus(ValuationStatus.NINCS);
}
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
public Long getGroupId() {
return groupId;
}
public void setGroupId(Long groupId) {
this.groupId = groupId;
}
public Valuation getNextVersion() {
return nextVersion;
}
public void setNextVersion(Valuation nextVersion) {
this.nextVersion = nextVersion;
}
public int getOptLock() {
return optLock;
}
public void setOptLock(int optLock) {
this.optLock = optLock;
}
public boolean isConsidered() {
return considered;
}
public void setConsidered(boolean considered) {
this.considered = considered;
}
public User getSender() {
return sender;
}
public void setSender(User sender) {
this.sender = sender;
}
public Semester getSemester() {
return semester;
}
public void setSemester(Semester semester) {
this.semester = semester;
}
public Date getLastConsidered() {
return lastConsidered;
}
public void setLastConsidered(Date lastConsidered) {
this.lastConsidered = lastConsidered;
}
public Date getSended() {
return sended;
}
public void setSended(Date sended) {
this.sended = sended;
}
public Date getLastModified() {
return lastModified;
}
public void setLastModified(Date lastModified) {
this.lastModified = lastModified;
}
public ValuationStatus getEntrantStatus() {
return entrantStatus;
}
public void setEntrantStatus(ValuationStatus entrantStatus) {
this.entrantStatus = entrantStatus;
}
public ValuationStatus getPointStatus() {
return pointStatus;
}
public void setPointStatus(ValuationStatus pointStatus) {
this.pointStatus = pointStatus;
}
public Set<EntrantRequest> getEntrantRequestsAsSet() {
return entrantRequestsAsSet;
}
public void setEntrantRequestsAsSet(Set<EntrantRequest> entrantRequestsAsSet) {
this.entrantRequestsAsSet = entrantRequestsAsSet;
}
public Set<PointRequest> getPointRequestsAsSet() {
return pointRequestsAsSet;
}
public void setPointRequestsAsSet(Set<PointRequest> pointRequestsAsSet) {
this.pointRequestsAsSet = pointRequestsAsSet;
}
public String getValuationText() {
return valuationText;
}
public void setValuationText(String valuationText) {
this.valuationText = valuationText;
}
public String getExplanation() {
return explanation;
}
public void setExplanation(String explanation) {
this.explanation = explanation;
}
public String getPrinciple() {
return principle;
}
public void setPrinciple(String principle) {
this.principle = principle;
}
public User getConsideredBy() {
return consideredBy;
}
public void setConsideredBy(User consideredBy) {
this.consideredBy = consideredBy;
}
public Float getAveragePoint() {
return averagePoint;
}
public void setAveragePoint(Float averagePoint) {
this.averagePoint = averagePoint;
}
public boolean entrantsAreAccepted() {
return entrantStatus == ValuationStatus.ELFOGADVA;
}
public boolean pointsAreAccepted() {
return pointStatus == ValuationStatus.ELFOGADVA;
}
@Override
public String toString() {
return new StringBuilder("Valuation: ").append(semester).append(" ").append(group.getName()).toString();
}
/**
* Ennek a segítségével csinálunk új verziót, ha módosítottak rajta
* @return
*/
public Valuation copy() {
Valuation v = new Valuation();
v.setGroup(group);
v.setSender(sender);
v.setValuationText(valuationText);
v.setPrinciple(principle);
v.setPointStatus(pointStatus);
v.setEntrantStatus(entrantStatus);
v.setSemester(semester);
v.setSended(sended); // vajon ez maradjon a régi, vagy legyen friss?
v.setLastModified(lastModified);
v.setConsidered(false);
return v;
}
/**
* Lemásoljuk az értékelés pontkérelmeit a paraméterben megadott értékeléshez,
* amiket hozzá is rendelünk.
*
* @param v az értékelés, amelyiknek beállítjuk a másolatokat
*/
public void copyPointRequests(Valuation v) {
Set<PointRequest> pReqs = getPointRequestsAsSet();
Set<PointRequest> result = new HashSet<>(pReqs.size());
for (PointRequest pr : pReqs) {
result.add(pr.copy(v));
}
v.setPointRequestsAsSet(result);
}
/**
* Lemásoljuk az értékelés belépőkérelmeit a paraméterben megadott értékeléshez,
* amiket hozzá is rendelünk.
*
* @param v az értékelés, amelyiknek beállítjuk a másolatokat
*/
public void copyEntrantRequests(Valuation newVersion) {
Set<EntrantRequest> eReqs = getEntrantRequestsAsSet();
Set<EntrantRequest> result = new HashSet<>(eReqs.size());
for (EntrantRequest er : eReqs) {
result.add(er.copy(newVersion));
}
newVersion.setEntrantRequestsAsSet(result);
}
public boolean isObsolete() {
return nextVersion != null;
}
}