package fi.arcusys.koku.common.service.impl;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ejb.Stateless;
import fi.arcusys.koku.common.service.AuthorizationDAO;
import fi.arcusys.koku.common.service.datamodel.Authorization;
import fi.arcusys.koku.common.service.datamodel.AuthorizationReplyStatus;
import fi.arcusys.koku.common.service.datamodel.User;
import fi.arcusys.koku.common.service.dto.AuthorizationDTOCriteria;
/**
* DAO implementation for CRUD operations with 'Authorization' Entity
*
* @author Dmitry Kudinov (dmitry.kudinov@arcusys.fi)
* Sep 12, 2011
*/
@Stateless
public class AuthorizationDAOImpl extends AbstractEntityDAOImpl<Authorization> implements AuthorizationDAO {
public AuthorizationDAOImpl() {
super(Authorization.class);
}
/**
* @param orCreateUser
* @param startNum
* @param maxResults
* @return
*/
@Override
public List<Authorization> getReceivedAuthorizations(User user, int startNum, int maxResults) {
return getResultList("findReceivedAuthorizations", Collections.singletonMap("user", user), startNum, maxResults);
}
/**
* @param orCreateUser
* @param startNum
* @param maxResults
* @return
*/
@Override
public List<Authorization> getSentAuthorizations(User user, int startNum, int maxResults) {
return getResultList("findSentAuthorizations", Collections.singletonMap("user", user), startNum, maxResults);
}
/**
* @param userUid
* @return
*/
@Override
public Long getTotalSentAuthorizations(User user) {
return getSingleResult("countSentAuthorizations", Collections.singletonMap("user", user));
}
/**
* @param userUid
* @return
*/
@Override
public Long getTotalReceivedAuthorizations(User user) {
return getSingleResult("countReceivedAuthorizations", Collections.singletonMap("user", user));
}
/**
* @param query
* @return
*/
@Override
public List<Authorization> getAuthorizations(AuthorizationDTOCriteria criteria, int startNum, int maxResults) {
final StringBuilder query = new StringBuilder();
// select
query.append("SELECT DISTINCT auth FROM Authorization auth ");
final Map<String, Object> params = processCriteria(criteria, query);
// order by
query.append(" ORDER BY auth.id DESC");
return executeQuery(query.toString(), params, startNum, maxResults);
}
private Map<String, Object> processCriteria(AuthorizationDTOCriteria criteria, final StringBuilder query) {
final Map<String, Object> params = new HashMap<String, Object>();
query.append(" WHERE auth.replyStatus = :replyStatus ");
params.put("replyStatus", AuthorizationReplyStatus.Approved);
// criteria applied
final Long templateId = criteria.getAuthorizationTemplateId();
if (templateId != null) {
query.append(" AND auth.template.id = :templateId " );
params.put("templateId", templateId);
}
final String senderUid = criteria.getSenderUid();
if (senderUid != null && !"".equals(senderUid.trim())) {
query.append(" AND auth.fromUser.uid = :senderUid ");
params.put("senderUid", senderUid);
}
final String receipientUid = criteria.getReceipientUid();
if (receipientUid != null && !"".equals(receipientUid.trim())) {
query.append(" AND auth.toUser.uid = :receipientUid ");
params.put("receipientUid", receipientUid);
}
final String targetPersonUid = criteria.getTargetPersonUid();
if (targetPersonUid != null && !"".equals(targetPersonUid.trim())) {
query.append(" AND auth.targetPerson.uid = :targetPersonUid ");
params.put("targetPersonUid", targetPersonUid);
}
return params;
}
/**
* @param authorizationDTOCriteria
* @return
*/
@Override
public Long getTotalAuthorizations(AuthorizationDTOCriteria criteria) {
final StringBuilder query = new StringBuilder();
// select
query.append("SELECT COUNT(DISTINCT auth) FROM Authorization auth ");
final Map<String, Object> params = processCriteria(criteria, query);
return executeQueryWithSingleResult(query.toString(), params);
}
}