/* * Copyright 2009-2012 by KNURT Systeme (http://www.knurt.de) * * Licensed under the Creative Commons License Attribution-NonCommercial-ShareAlike 3.0 Unported; * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://creativecommons.org/licenses/by-nc-sa/3.0/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package de.knurt.fam.template.model; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.List; import java.util.Properties; import de.knurt.fam.connector.RedirectTarget; import de.knurt.fam.core.model.config.BookingStrategy; import de.knurt.fam.core.model.config.Facility; import de.knurt.fam.core.model.config.FacilityBookable; import de.knurt.fam.core.model.persist.booking.Booking; import de.knurt.fam.core.model.persist.booking.QueueBooking; import de.knurt.fam.core.model.persist.booking.TimeBooking; import de.knurt.fam.core.persistence.dao.FamDaoProxy; import de.knurt.fam.core.persistence.dao.config.FacilityConfigDao; import de.knurt.fam.core.util.mvc.QueryStringBuilder; import de.knurt.fam.core.util.mvc.RedirectResolver; import de.knurt.fam.core.util.mvc.RequestInterpreter; import de.knurt.heinzelmann.util.query.QueryString; import de.knurt.heinzelmann.util.time.SimpleTimeFrame; import de.knurt.heinzelmann.util.time.TimeFrame; /** * controller for see in rework the input of a session for operator side. * * class named <code>WorkOnJobsModelFactory</code> before * * @see SimpleSession * @author Daniel Oltmanns * @since 1.3.0 (11/21/2010) */ public class JobsManagerModelFactory { public Properties getProperties(TemplateResource templateResource) { Properties result = new Properties(); List<FacilityBookable> usersFacilities; if(templateResource.getAuthUser().isAdmin()) { usersFacilities = FacilityConfigDao.getInstance().getBookableFacilities(); } else { usersFacilities = FacilityConfigDao.bookablefacilities(templateResource.getAuthUser().getFacilityKeysUserIsResponsibleFor()); } FacilityBookable facility = this.getFacilityBookable(templateResource); if (facility == null) { // no facility given in request. put out first facility of // responsibility if (usersFacilities != null && usersFacilities.size() > 0) { for (Facility facilityCandidate : usersFacilities) { if (facilityCandidate.isBookable()) { facility = (FacilityBookable) facilityCandidate; break; } } } } if (facility == null) { // bad request RedirectResolver.redirectClient(RedirectTarget.PUBLIC_HOME, templateResource); } else { // good request result = this.getGeneralProperties(facility); Booking booking = RequestInterpreter.getBooking(templateResource.getRequest()); if (booking != null && booking.isCanceled()) { // ↖ in javascript, you can cancel a booking and process it // ↖ then. just reload the page RedirectResolver.redirectClient(RedirectTarget.ADMIN_JOBS_MANAGER, templateResource); } else { // set queue based flag boolean queueBased = facility.getBookingRule().getBookingStrategy() == BookingStrategy.QUEUE_BASED; result.put("is_queue_based", queueBased); // set jobs result.put("bookings", queueBased ? this.getQueueBookingsCurrentJobs(templateResource, facility) : this.getTimeBookingsCurrentJobs(templateResource, facility)); // set facilitly result.put("facility", facility); // set if past is requested result.put("isRequest4Past", this.isRequest4Past(templateResource)); // set if past is requested result.put("hasResponsibility", templateResource.getAuthUser().hasResponsibility4Facility(facility)); } } result.put("users_facilities", usersFacilities); return result; } private List<TimeBooking> getTimeBookingsCurrentJobs(TemplateResource templateResource, FacilityBookable bd) { TimeBooking example = TimeBooking.getEmptyExampleBooking(); example.setFacilityKey(bd.getKey()); List<TimeBooking> timeBookings = new ArrayList<TimeBooking>(); boolean isRequest4Past = this.isRequest4Past(templateResource); List<Booking> candidates = FamDaoProxy.bookingDao().getObjectsLike(example); for (Booking candidate : candidates) { if (((!isRequest4Past && !candidate.isProcessed()) || (isRequest4Past && candidate.isProcessed())) && !candidate.isCanceled() && !candidate.isApplication()) { timeBookings.add((TimeBooking) candidate); } } Collections.sort(timeBookings); if (isRequest4Past) { Collections.reverse(timeBookings); } return timeBookings; } private List<QueueBooking> getQueueBookingsCurrentJobs(TemplateResource templateResource, FacilityBookable facility) { List<QueueBooking> queueBookings = null; boolean isRequest4Past = this.isRequest4Past(templateResource); if (isRequest4Past) { QueueBooking example = QueueBooking.getBooking4Query(); example.setFacilityKey(facility.getKey()); queueBookings = new ArrayList<QueueBooking>(); List<Booking> candidates = FamDaoProxy.bookingDao().getObjectsLike(example); for (Booking candidate : candidates) { if (candidate.isProcessed() && !candidate.isCanceled()) { queueBookings.add((QueueBooking) candidate); } } } else { queueBookings = FamDaoProxy.bookingDao().getCurrentQueue(facility); } Collections.sort(queueBookings); if (isRequest4Past) { Collections.reverse(queueBookings); } return queueBookings; } private boolean isRequest4Past(TemplateResource templateResource) { String past = templateResource.getRequest().getParameter("past"); return past != null && past.equals("1"); } private int getUnitsInUseNow(FacilityBookable bd) { TimeFrame test = new SimpleTimeFrame(); test.addEnd(Calendar.MINUTE, 1); return FamDaoProxy.bookingDao().getUncanceledBookingsWithoutApplicationsIn(bd, test).size(); } private Properties getGeneralProperties(FacilityBookable facility) { Properties result = new Properties(); if (facility != null) { QueryString qs = QueryStringBuilder.getQueryString(facility); qs.put("past", "1"); result.put("alreadyProcessedQueryString", qs.getAsHtmlLinkHref(true)); int unitsInUseNow = this.getUnitsInUseNow(facility); if (unitsInUseNow >= 0) { result.put("showUnitsUsedNow", "t"); result.put("unitsUsedNow", unitsInUseNow); } else { result.put("showUnitsUsedNow", "f"); result.put("unitsUsedNow", ""); } } return result; } private FacilityBookable getFacilityBookable(TemplateResource templateResource) { return RequestInterpreter.getBookableFacility(templateResource.getRequest()); } }