package fi.arcusys.koku.common.service.impl;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.ejb.Stateless;
import fi.arcusys.koku.common.service.AppointmentDAO;
import fi.arcusys.koku.common.service.datamodel.Appointment;
import fi.arcusys.koku.common.service.datamodel.AppointmentResponse;
import fi.arcusys.koku.common.service.datamodel.AppointmentResponseStatus;
import fi.arcusys.koku.common.service.datamodel.AppointmentStatus;
import fi.arcusys.koku.common.service.datamodel.TargetPerson;
import fi.arcusys.koku.common.service.datamodel.User;
import fi.arcusys.koku.common.service.dto.AppointmentDTOCriteria;
/**
* DAO implementation for CRUD operations with 'Appointment' Entity
*
* @author Dmitry Kudinov (dmitry.kudinov@arcusys.fi)
* Jul 21, 2011
*/
@Stateless
public class AppointmentDAOImpl extends AbstractEntityDAOImpl<Appointment> implements AppointmentDAO {
/**
* @param clazz
*/
public AppointmentDAOImpl() {
super(Appointment.class);
}
@Override
public Appointment create(Appointment entity) {
final Set<TargetPerson> receipients = new HashSet<TargetPerson>();
for (final TargetPerson receipient : entity.getRecipients()) {
receipients.add(em.merge(receipient));
}
entity.setRecipients(receipients);
return super.create(entity);
}
public List<Appointment> getUserAppointments(final User user, final Set<AppointmentStatus> statuses) {
return getUserAppointments(user, statuses, FIRST_RESULT_NUMBER, FIRST_RESULT_NUMBER + MAX_RESULTS_COUNT - 1);
}
public List<Appointment> getUserAppointments(final User user, final Set<AppointmentStatus> statuses, final int startNum, final int maxNum) {
return getAppointmentsByUserAndStatus(user, statuses, "findAppointmentByUserAndStatuses", startNum, maxNum);
}
public List<Appointment> getAssignedAppointments(final User user) {
return getAssignedAppointments(user, FIRST_RESULT_NUMBER, FIRST_RESULT_NUMBER + MAX_RESULTS_COUNT - 1);
}
public List<Appointment> getAssignedAppointments(final User user, final int startNum, final int maxNum) {
return getAppointmentsByUserAndStatus(user, getAssignedAppointmentsStatus(), "findAssignedAppointments", startNum, maxNum);
}
private Set<AppointmentStatus> getAssignedAppointmentsStatus() {
return Collections.singleton(AppointmentStatus.Created);
}
private List<Appointment> getAppointmentsByUserAndStatus(final User user,
final Set<AppointmentStatus> statuses, final String queryName,
final int startNum, final int maxResults) {
if (user == null || statuses == null || statuses.isEmpty()) {
return Collections.emptyList();
}
final Map<String, Object> params = getCommonSearchParams(user, statuses);
return getResultList(queryName, params, startNum, maxResults);
}
private HashMap<String, Object> getCommonSearchParams(final User user, final Set<AppointmentStatus> statuses) {
final HashMap<String, Object> params = new HashMap<String, Object>();
params.put("user", user);
params.put("statuses", statuses);
return params;
}
/**
* @param user
* @param statuses
* @return
*/
@Override
public Long getTotalAppointments(final User user, final Set<AppointmentStatus> statuses) {
return getSingleResult("countAppointmentsByUserAndStatuses", getCommonSearchParams(user, statuses));
}
/**
* @param user
* @return
*/
@Override
public Long getTotalAssignedAppointments(User user) {
return getSingleResult("countAssignedAppointments", getCommonSearchParams(user, getAssignedAppointmentsStatus()));
}
/**
* @param user
* @return
*/
@Override
public List<Appointment> getProcessedAppointments(User user, final int startNum, final int maxResults, final AppointmentDTOCriteria criteria) {
if (criteria.getTargetPersonUid() != null) {
return getResultList("findProcessedAppointmentsBySenderAndTarget", getParamsForSenderAndTarget(user, criteria.getTargetPersonUid()), startNum, maxResults);
} else {
return getResultList("findProcessedAppointmentsBySender", getParamsForSender(user), startNum, maxResults);
}
}
private Map<String, Object> getParamsForSender(User user) {
final Map<String, Object> params = new HashMap<String, Object>();
params.put("sender", user);
params.put("status_cancelled", AppointmentStatus.Cancelled);
return params;
}
private Map<String, Object> getParamsForSenderAndTarget(User user, final String targetUserUid) {
final Map<String, Object> params = new HashMap<String, Object>();
params.put("sender", user);
params.put("targetUserUid", targetUserUid);
params.put("status_cancelled", AppointmentStatus.Cancelled);
return params;
}
/**
* @param user
* @return
*/
@Override
public Long getTotalProcessedAppointments(User user, final AppointmentDTOCriteria criteria) {
if (criteria.getTargetPersonUid() != null) {
return getSingleResult("countProcessedAppointmentsBySenderAndTarget", getParamsForSenderAndTarget(user, criteria.getTargetPersonUid()));
} else {
return getSingleResult("countProcessedAppointmentsBySender", getParamsForSender(user));
}
}
/**
* @param user
* @param startNum
* @param maxResults
* @return
*/
@Override
public List<Appointment> getCreatedAppointments(User user, int startNum, int maxResults, final AppointmentDTOCriteria criteria) {
if (criteria.getTargetPersonUid() != null) {
return getResultList("findCreatedAppointmentsBySenderAndTarget", getParamsForSenderAndTarget(user, criteria.getTargetPersonUid()), startNum, maxResults);
} else {
return getResultList("findCreatedAppointmentsBySender", getParamsForSender(user), startNum, maxResults);
}
}
/**
* @param user
* @return
*/
@Override
public Long getTotalCreatedAppointments(User user, final AppointmentDTOCriteria criteria) {
if (criteria.getTargetPersonUid() != null) {
return getSingleResult("countCreatedAppointmentsBySenderAndTarget", getParamsForSenderAndTarget(user, criteria.getTargetPersonUid()));
} else {
return getSingleResult("countCreatedAppointmentsBySender", getParamsForSender(user));
}
}
/**
* @param user
* @param startNum
* @param maxResults
* @return
*/
@Override
public List<AppointmentResponse> getAppointmentResponses(User user,
int startNum, int maxResults) {
return getResultList("findAppointmentResponsesByUser", getRespondedAppointmentsParams(user), startNum, maxResults);
}
protected Map<String, Object> getRespondedAppointmentsParams(User user) {
final Map<String, Object> params = new HashMap<String, Object>();
params.put("user", user);
params.put("appointment_approved", Arrays.<AppointmentStatus>asList(AppointmentStatus.Created, AppointmentStatus.Approved));
params.put("reply_approved", AppointmentResponseStatus.Accepted);
return params;
}
/**
* @param user
* @return
*/
@Override
public Long getTotalRespondedAppointments(User user) {
return getSingleResult("countAppointmentResponsesByUser", getRespondedAppointmentsParams(user));
}
/**
* @param user
* @param startNum
* @param maxResults
* @return
*/
@Override
public List<AppointmentResponse> getOldAppointmentResponses(User user, int startNum, int maxResults) {
return getResultList("findOldAppointmentResponsesByUser", getRespondedAppointmentsParams(user), startNum, maxResults);
}
/**
* @param user
* @return
*/
@Override
public Long getTotalOldRespondedAppointments(User user) {
return getSingleResult("countOldAppointmentResponsesByUser", getRespondedAppointmentsParams(user));
}
}