package fi.arcusys.koku.common.service.datamodel; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToMany; import javax.persistence.PrePersist; import javax.persistence.PreUpdate; /** * Entity for representing Request in KV-Requests functionality. * * @author Dmitry Kudinov (dmitry.kudinov@arcusys.fi) * Jun 23, 2011 */ @Entity @NamedQueries({ @NamedQuery(name = Request.GET_REQUESTS_BY_IDS, query = "SELECT DISTINCT r FROM Request r WHERE r.id in (:ids) ORDER BY r.id DESC"), @NamedQuery(name = "findRequestsByUserUid", query = "SELECT DISTINCT r FROM Request r WHERE r.fromUser = :user " + " AND (r.replyTill IS NULL OR r.replyTill >= CURRENT_DATE) " + " ORDER BY r.id DESC"), @NamedQuery(name = "countRequestsByUserUid", query = "SELECT COUNT(DISTINCT r) FROM Request r WHERE r.fromUser = :user" + " AND (r.replyTill IS NULL OR r.replyTill >= CURRENT_DATE)"), @NamedQuery(name = "findRequestsByUserUidOrRoles", query = "SELECT DISTINCT r FROM Request r " + " WHERE (r.fromUser = :user OR r.fromRoleUid in (:userRoles)) " + " AND (r.replyTill IS NULL OR r.replyTill >= CURRENT_DATE) " + " ORDER BY r.id DESC"), @NamedQuery(name = "countRequestsByUserUidOrRoles", query = "SELECT COUNT(DISTINCT r) FROM Request r " + " WHERE (r.fromUser = :user OR r.fromRoleUid in (:userRoles)) " + " AND (r.replyTill IS NULL OR r.replyTill >= CURRENT_DATE)"), @NamedQuery(name = "findOldRequestsByUserUid", query = "SELECT DISTINCT r FROM Request r WHERE r.fromUser = :user " + " AND (r.replyTill IS NOT NULL AND r.replyTill < CURRENT_DATE) " + " ORDER BY r.id DESC"), @NamedQuery(name = "countOldRequestsByUserUid", query = "SELECT COUNT(DISTINCT r) FROM Request r WHERE r.fromUser = :user" + " AND (r.replyTill IS NOT NULL AND r.replyTill < CURRENT_DATE)"), @NamedQuery(name = "findOldRequestsByUserUidOrRoles", query = "SELECT DISTINCT r FROM Request r " + " WHERE (r.fromUser = :user OR r.fromRoleUid in (:userRoles)) " + " AND (r.replyTill IS NOT NULL AND r.replyTill < CURRENT_DATE) " + " ORDER BY r.id DESC"), @NamedQuery(name = "countOldRequestsByUserUidOrRoles", query = "SELECT COUNT(DISTINCT r) FROM Request r " + " WHERE (r.fromUser = :user OR r.fromRoleUid in (:userRoles)) " + " AND (r.replyTill IS NOT NULL AND r.replyTill < CURRENT_DATE)"), @NamedQuery(name = "countRequestsByTemplate", query = "SELECT COUNT(DISTINCT r) FROM Request r WHERE r.template = :template"), @NamedQuery(name = "findOpenRequestsByNotificationDate", query = "SELECT r FROM Request r " + " WHERE (SELECT COUNT (rs) FROM Response rs WHERE rs.request = r) < (SELECT COUNT(repl) FROM User_ repl WHERE repl MEMBER OF r.receipients)" + " AND r.notifyDate BETWEEN :notifyDateFrom AND :notifyDateTo ") }) public class Request extends AbstractEntity { public static final String GET_REQUESTS_BY_IDS = "findRequestsByIds"; public static final String GET_REQUESTS_BY_USER_UID = "findRequestsByUserUid"; private Date replyTill; private Integer notifyBeforeDays; private Date notifyDate; @ManyToOne private RequestTemplate template; @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "request") private Set<Response> responses; private String subject; @ManyToOne private User fromUser; private String fromRoleUid; @ManyToMany(fetch = FetchType.EAGER) private Set<User> receipients; /** * @return the fromRole */ public String getFromRoleUid() { return fromRoleUid; } /** * @param fromRole the fromRole to set */ public void setFromRoleUid(String fromRoleUid) { this.fromRoleUid = fromRoleUid; } /** * @return the subject */ public String getSubject() { return subject; } /** * @param subject the subject to set */ public void setSubject(String subject) { this.subject = subject; } /** * @return the fromUser */ public User getFromUser() { return fromUser; } /** * @param fromUser the fromUser to set */ public void setFromUser(User fromUser) { this.fromUser = fromUser; } /** * @return the receipients */ public Set<User> getReceipients() { return receipients; } /** * @param receipients the receipients to set */ public void setReceipients(Set<User> receipients) { this.receipients = receipients; } /** * @return the template */ public RequestTemplate getTemplate() { return template; } /** * @param template the template to set */ public void setTemplate(RequestTemplate template) { this.template = template; } /** * @return the responses */ public List<Response> getResponses() { if (this.responses == null) { return Collections.emptyList(); } return new ArrayList<Response>(responses); } /** * @param responses the responses to set */ public void setResponses(List<Response> responses) { this.responses = new HashSet<Response>(responses); } /** * @return the replyTill */ public Date getReplyTill() { return replyTill; } /** * @param replyTill the replyTill to set */ public void setReplyTill(Date replyTill) { this.replyTill = replyTill; } /** * @return the notifyBeforeDays */ public Integer getNotifyBeforeDays() { return notifyBeforeDays; } /** * @param notifyBeforeDays the notifyBeforeDays to set */ public void setNotifyBeforeDays(Integer notifyBeforeDays) { this.notifyBeforeDays = notifyBeforeDays; } @PrePersist @PreUpdate public void updateNotifyDate() { if (this.replyTill != null && this.notifyBeforeDays != null) { final Calendar calendar = Calendar.getInstance(); calendar.setTime(replyTill); calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) - this.notifyBeforeDays); this.notifyDate = calendar.getTime(); } } }