package fi.otavanopisto.pyramus.views.courses; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.Currency; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; import org.apache.commons.lang3.builder.HashCodeBuilder; import fi.internetix.smvc.SmvcRuntimeException; import fi.internetix.smvc.controllers.PageRequestContext; import fi.otavanopisto.pyramus.dao.DAOFactory; import fi.otavanopisto.pyramus.dao.accommodation.RoomDAO; import fi.otavanopisto.pyramus.dao.accommodation.RoomTypeDAO; import fi.otavanopisto.pyramus.dao.base.BillingDetailsDAO; import fi.otavanopisto.pyramus.dao.courses.CourseStudentDAO; import fi.otavanopisto.pyramus.domainmodel.accommodation.Room; import fi.otavanopisto.pyramus.domainmodel.accommodation.RoomType; import fi.otavanopisto.pyramus.domainmodel.base.BillingDetails; import fi.otavanopisto.pyramus.domainmodel.courses.CourseStudent; import fi.otavanopisto.pyramus.framework.PyramusStatusCode; import fi.otavanopisto.pyramus.framework.PyramusViewController; import fi.otavanopisto.pyramus.framework.UserRole; public class CourseStudentDetailsDialogViewController extends PyramusViewController { public void process(PageRequestContext pageRequestContext) { CourseStudentDAO courseStudentDAO = DAOFactory.getInstance().getCourseStudentDAO(); RoomTypeDAO roomTypeDAO = DAOFactory.getInstance().getRoomTypeDAO(); RoomDAO roomDAO = DAOFactory.getInstance().getRoomDAO(); Long courseStudentId = pageRequestContext.getLong("courseStudentId"); if (courseStudentId == null) { throw new SmvcRuntimeException(PyramusStatusCode.UNDEFINED, "Missing courseStudentId parameter"); } CourseStudent courseStudent = courseStudentDAO.findById(courseStudentId); if (courseStudent == null) { throw new SmvcRuntimeException(PyramusStatusCode.UNDEFINED, "Invalid courseStudentId parameter"); } Map<RoomType, List<Room>> rooms = new TreeMap<>(new Comparator<RoomType>() { @Override public int compare(RoomType o1, RoomType o2) { return o1.getName().compareTo(o2.getName()); } }); List<RoomType> roomTypes = roomTypeDAO.listAll(); for (RoomType roomType : roomTypes) { List<Room> typeRooms = roomDAO.listByType(roomType); rooms.put(roomType, typeRooms); } // Support other currencies List<Currency> currencies = Arrays.asList(Currency.getInstance("EUR")); List<BillingDetails> existingBillingDetails = getExistingBillingDetails(courseStudent); pageRequestContext.getRequest().setAttribute("courseStudent", courseStudent); pageRequestContext.getRequest().setAttribute("rooms", rooms); pageRequestContext.getRequest().setAttribute("currencies", currencies); pageRequestContext.getRequest().setAttribute("existingBillingDetails", existingBillingDetails); pageRequestContext.setIncludeJSP("/templates/courses/studentdetailsdialog.jsp"); } private List<BillingDetails> getExistingBillingDetails(CourseStudent courseStudent) { Map<Integer, BillingDetails> result = new HashMap<>(); BillingDetailsDAO billingDetailsDAO = DAOFactory.getInstance().getBillingDetailsDAO(); List<BillingDetails> billingDetails = billingDetailsDAO.listByStudent(courseStudent.getStudent()); for (BillingDetails studentBillingDetails : billingDetails) { result.put(getBillingDetailsHash(studentBillingDetails), studentBillingDetails); } if (courseStudent.getBillingDetails() != null) { result.remove(getBillingDetailsHash(courseStudent.getBillingDetails())); } return new ArrayList<>(result.values()); } private int getBillingDetailsHash(BillingDetails studentBillingDetails) { HashCodeBuilder builder = new HashCodeBuilder(43, 83); builder.append(studentBillingDetails.getCity()); builder.append(studentBillingDetails.getCompanyIdentifier()); builder.append(studentBillingDetails.getCompanyName()); builder.append(studentBillingDetails.getCountry()); builder.append(studentBillingDetails.getElectronicBillingAddress()); builder.append(studentBillingDetails.getEmailAddress()); builder.append(studentBillingDetails.getNotes()); builder.append(studentBillingDetails.getPersonName()); builder.append(studentBillingDetails.getPhoneNumber()); builder.append(studentBillingDetails.getPostalCode()); builder.append(studentBillingDetails.getReferenceNumber()); builder.append(studentBillingDetails.getRegion()); builder.append(studentBillingDetails.getStreetAddress1()); builder.append(studentBillingDetails.getStreetAddress2()); return builder.toHashCode(); } public UserRole[] getAllowedRoles() { return new UserRole[] { UserRole.MANAGER, UserRole.STUDY_PROGRAMME_LEADER, UserRole.ADMINISTRATOR }; } }