package fi.arcusys.koku.common.service.impl; import java.util.Calendar; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.ejb.Stateless; import fi.arcusys.koku.common.service.CalendarUtil; import fi.arcusys.koku.common.service.ConsentDAO; import fi.arcusys.koku.common.service.datamodel.Consent; import fi.arcusys.koku.common.service.datamodel.ConsentReplyStatus; import fi.arcusys.koku.common.service.datamodel.ReceipientsType; import fi.arcusys.koku.common.service.datamodel.User; import fi.arcusys.koku.common.service.dto.ConsentDTOCriteria; import fi.arcusys.koku.common.service.dto.ConsentExtDtoCriteria; /** * DAO implementation for CRUD operations with 'Consent' Entity * * @author Dmitry Kudinov (dmitry.kudinov@arcusys.fi) * Aug 23, 2011 */ @Stateless public class ConsentDAOImpl extends AbstractEntityDAOImpl<Consent> implements ConsentDAO { /** * */ private static final int MAX_CONSENTS_RETREIVED = 50; public ConsentDAOImpl() { super(Consent.class); } /** * @param user * @param startNum * @param maxNum * @return */ @Override public List<Consent> getAssignedConsents(User user, int startNum, int maxNum) { return getResultList("findAssignedConsentsByUser", Collections.singletonMap("userUid", user.getUid()), startNum, maxNum); } /** * @param user * @return */ @Override public Long getTotalAssignedConsents(User user) { return getSingleResult("countAssignedConsentsByUser", Collections.singletonMap("userUid", user.getUid())); } /** * @param user * @param startNum * @param maxNum * @return */ @Override public List<Consent> getProcessedConsents(User user, ConsentDTOCriteria criteria, int startNum, int maxNum) { if (criteria == null || criteria.isEmpty()) { return getResultList("findProcessedConsentsBySender", Collections.singletonMap("sender", user), startNum, maxNum); } else { /* "SELECT DISTINCT cn FROM Consent cn WHERE " + * "(EXISTS (SELECT cr FROM ConsentReply cr WHERE cr.consent = cn))" + * " AND cn.creator.uid = :senderUid ORDER BY cn.id DESC" * */ final StringBuilder query = new StringBuilder(); // select query.append("SELECT DISTINCT cn FROM Consent cn "); final Map<String, Object> params = processCriteria(user, criteria, query); // order by query.append(" ORDER BY cn.id DESC"); return executeQuery(query.toString(), params, startNum, maxNum); } } private Map<String, Object> processCriteria(User user, ConsentDTOCriteria criteria, final StringBuilder query) { final Map<String, Object> params = new HashMap<String, Object>(); // where query.append(" WHERE cn.creator = :sender "); params.put("sender", user); // criteria applied final Long templateId = criteria.getConsentTemplateId(); if (templateId != null) { query.append(" AND cn.template.id = :templateId" ); params.put("templateId", templateId); } final String receipientUid = criteria.getReceipientUid(); if (receipientUid != null && !"".equals(receipientUid.trim())) { query.append(" AND (EXISTS (SELECT cr FROM ConsentReply cr WHERE cr.consent = cn and cr.replier.uid = :replierUid )) "); params.put("replierUid", receipientUid); } else { query.append(" AND (EXISTS (SELECT cr FROM ConsentReply cr WHERE cr.consent = cn)) "); } return params; } /** * @param user * @return */ @Override public Long getTotalProcessedConsents(User user, ConsentDTOCriteria criteria) { final StringBuilder query = new StringBuilder(); query.append("SELECT COUNT (DISTINCT cn) FROM Consent cn "); final Map<String, Object> params = processCriteria(user, criteria, query); return executeQueryWithSingleResult(query.toString(), params); } /** * @param dtoCriteria * @return */ @Override public List<Consent> searchConsents(ConsentExtDtoCriteria criteria) { final StringBuilder query = new StringBuilder(); // select query.append("SELECT DISTINCT cn FROM Consent cn LEFT JOIN cn.givenTo givenTo_ "); final Map<String, Object> params = new HashMap<String, Object>(); // where query.append(" WHERE 1 = 1 "); // criteria applied final String templatePrefix = criteria.getTemplateNamePrefix(); if (templatePrefix != null && !"".equals(templatePrefix.trim())) { query.append(" AND (cn.template.code IS NULL AND cn.template.title LIKE :templateNamePrefix OR cn.template.code LIKE :templateNamePrefix ) " ); params.put("templateNamePrefix", getPrefixLike(templatePrefix)); } final String targetPersonUid = criteria.getTargetPerson(); if (targetPersonUid != null && !"".equals(targetPersonUid.trim())) { query.append(" AND cn.targetPerson.uid = :targetPersonUid "); params.put("targetPersonUid", targetPersonUid); } // getGivenTo final List<String> givenTo = criteria.getGivenTo(); if (givenTo != null && !givenTo.isEmpty()) { query.append(" AND givenTo_.partyId IN (:givenTo) "); params.put("givenTo", givenTo); } // getInformationTargetId final String informationTargetId = criteria.getInformationTargetId(); if (informationTargetId != null && !"".equals(informationTargetId.trim())) { query.append(" AND (cn.informationTargetId = :informationTargetId OR cn.informationTargetId IS NULL) "); params.put("informationTargetId", informationTargetId); } else { query.append(" AND cn.informationTargetId IS NULL "); } // order by query.append(" ORDER BY cn.id DESC"); return executeQuery(query.toString(), params, 1, ConsentDAOImpl.MAX_CONSENTS_RETREIVED); } /** * @param replyTill * @return */ @Override public List<Consent> getOpenConsentsByReplyTillDate(Date replyTill) { final Map<String, Object> params = new HashMap<String, Object>(); final Calendar calendar = CalendarUtil.getXmlDate(replyTill).toGregorianCalendar(); params.put("replyTillDateFrom", calendar.getTime()); calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + 1); calendar.set(Calendar.SECOND, calendar.get(Calendar.SECOND) - 1); params.put("replyTillDateTo", calendar.getTime()); params.put("receipientsTypeBoth", ReceipientsType.BothParents); return getResultList("findOpenConsentsByReplyTillDate", params); } }