/** * TNTConcept Easy Enterprise Management by Autentia Real Bussiness Solution S.L. * Copyright (C) 2007 Autentia Real Bussiness Solution S.L. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.autentia.tnt.manager.holiday; import java.util.Calendar; import java.util.Date; import java.util.Iterator; import java.util.List; import org.apache.commons.lang.time.DateUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.autentia.tnt.businessobject.Holiday; import com.autentia.tnt.businessobject.HolidayState; import com.autentia.tnt.businessobject.RequestHoliday; import com.autentia.tnt.businessobject.User; import com.autentia.tnt.businessobject.UserHolidaysState; import com.autentia.tnt.businessobject.WorkingAgreement; import com.autentia.tnt.dao.hibernate.UserDAO; import com.autentia.tnt.dao.hibernate.WorkingAgreementDAO; import com.autentia.tnt.dao.search.HolidaySearch; import com.autentia.tnt.dao.search.RequestHolidaySearch; import com.autentia.tnt.manager.holiday.HolidayManager; import com.autentia.tnt.util.SpringUtils; /* Activity - generated by stajanov (do not edit/delete) */ public class UserHolidaysStateManager { /** Logger */ private static final Log log = LogFactory.getLog(UserHolidaysStateManager.class); private UserDAO userDAO; public static UserHolidaysStateManager getDefault() { return (UserHolidaysStateManager)SpringUtils.getSpringBean("managerUserHolidaysState"); } /** * Empty constructor needed by CGLIB (Spring AOP) */ protected UserHolidaysStateManager() { } /** * Default constructor * @deprecated do not construct managers alone: use Spring's declared beans */ public UserHolidaysStateManager( UserDAO userDAO ) { this.userDAO = userDAO; } /** * @return Indica si un día es festivo */ private boolean isHoliday(List<Holiday> fiestas, Date date){ // ¿ Es fin de semana ? Calendar cActual = Calendar.getInstance(); cActual.setTime(date); if ((cActual.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) || (cActual.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY)){ return true; } Iterator<Holiday> ite = fiestas.iterator(); Holiday current; while (ite.hasNext()){ current = ite.next(); if (DateUtils.isSameDay(current.getDate(), date)){ return true; } } return false; } /** * @return Devuelve el número de días laborables que hay entre dos fechas */ public int getWorkingDays(Date fromDate, Date toDate) { int total = 0; // Evitamos un bucle infinito en el bucle que viene a continuación if (fromDate.before(toDate) || DateUtils.isSameDay(fromDate, toDate)){ HolidaySearch fiestaSearch = new HolidaySearch(); Date current = (Date) fromDate.clone(); fiestaSearch.setStartDate(fromDate); fiestaSearch.setEndDate(toDate); List<Holiday> fiestas = HolidayManager.getDefault().getAllEntities(fiestaSearch, null); while (current.before(toDate) || DateUtils.isSameDay(current, toDate)){ if (! this.isHoliday(fiestas, current)){ total++; } current = DateUtils.addDays(current, 1); } } return total; } public UserHolidaysState calcUserHolidaysState(User usuario, Date chargeYear) { UserHolidaysState uhs = new UserHolidaysState(); uhs.setUser(usuario); // WorkingAgreement attribute is an HB proxy not initialized, we need to get it from DB WorkingAgreementDAO workingAgreementDao = WorkingAgreementDAO.getDefault(); WorkingAgreement agreement = workingAgreementDao.getById(usuario.getAgreement().getId()); // and refresh the user instance agreement attribute usuario.setAgreement(agreement); uhs.setTotalYear(agreement.getHolidays()); int acceptedHolidays = 0; if(chargeYear!=null) { HolidayManager fiestasManager = HolidayManager.getDefault(); // We must take in account previous year holidays and next year holidays Calendar calMin = Calendar.getInstance(); calMin.setTime(chargeYear); calMin.set(Calendar.MONTH, calMin.getMinimum(Calendar.MONTH)); calMin.set(Calendar.DAY_OF_MONTH, calMin.getMinimum(Calendar.DAY_OF_MONTH)); calMin.set(Calendar.HOUR_OF_DAY, calMin.getMinimum(Calendar.HOUR_OF_DAY)); calMin.set(Calendar.MINUTE, calMin.getMinimum(Calendar.MINUTE)); calMin.set(Calendar.SECOND, calMin.getMinimum(Calendar.SECOND)); calMin.set(Calendar.MILLISECOND, calMin.getMinimum(Calendar.MILLISECOND)); Calendar calMax = Calendar.getInstance(); calMax.setTime(chargeYear); calMax.set(Calendar.MONTH, calMax.getMaximum(Calendar.MONTH)); calMax.set(Calendar.DAY_OF_MONTH, calMax.getMaximum(Calendar.DAY_OF_MONTH)); calMax.set(Calendar.HOUR_OF_DAY, calMax.getMaximum(Calendar.HOUR_OF_DAY)); calMax.set(Calendar.MINUTE, calMax.getMaximum(Calendar.MINUTE)); calMax.set(Calendar.SECOND, calMax.getMaximum(Calendar.SECOND)); calMax.set(Calendar.MILLISECOND, calMax.getMaximum(Calendar.MILLISECOND)); calMin.add(Calendar.YEAR, -1); calMax.add(Calendar.YEAR, 1); HolidaySearch fiestaSearch = new HolidaySearch(); fiestaSearch.setStartDate(calMin.getTime()); fiestaSearch.setEndDate(calMax.getTime()); List<Holiday> listFiestas = fiestasManager.getAllEntities(fiestaSearch, null); calMin.setTime(chargeYear); calMin.set(Calendar.MONTH, calMin.getMinimum(Calendar.MONTH)); calMin.set(Calendar.DAY_OF_MONTH, calMin.getMinimum(Calendar.DAY_OF_MONTH)); calMin.set(Calendar.HOUR_OF_DAY, calMin.getMinimum(Calendar.HOUR_OF_DAY)); calMin.set(Calendar.MINUTE, calMin.getMinimum(Calendar.MINUTE)); calMin.set(Calendar.SECOND, calMin.getMinimum(Calendar.SECOND)); calMin.set(Calendar.MILLISECOND, calMin.getMinimum(Calendar.MILLISECOND)); calMax.setTime(chargeYear); calMax.set(Calendar.MONTH, calMax.getMaximum(Calendar.MONTH)); calMax.set(Calendar.DAY_OF_MONTH, calMax.getMaximum(Calendar.DAY_OF_MONTH)); calMax.set(Calendar.HOUR_OF_DAY, calMax.getMaximum(Calendar.HOUR_OF_DAY)); calMax.set(Calendar.MINUTE, calMax.getMaximum(Calendar.MINUTE)); calMax.set(Calendar.SECOND, calMax.getMaximum(Calendar.SECOND)); calMax.set(Calendar.MILLISECOND, calMax.getMaximum(Calendar.MILLISECOND)); RequestHolidayManager holyManager = RequestHolidayManager.getDefault(); RequestHolidaySearch holSearch = new RequestHolidaySearch(); holSearch.setUserRequest(uhs.getUser()); holSearch.setState(HolidayState.ACCEPT); holSearch.setStartChargeYear(calMin.getTime()); holSearch.setEndChargeYear(calMax.getTime()); List<RequestHoliday> listH = holyManager.getAllEntities(holSearch, null); for (RequestHoliday rH : listH) { Calendar cActual = Calendar.getInstance(); cActual.setTime(rH.getBeginDate()); while (!cActual.getTime().after(rH.getFinalDate())) { if (cActual.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY && cActual.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) { boolean isFiesta = false; for(Holiday fiest: listFiestas) { Calendar cFiesta = Calendar.getInstance(); cFiesta.setTime(fiest.getDate()); if(cFiesta.get(Calendar.YEAR) == cActual.get(Calendar.YEAR) && cFiesta.get(Calendar.MONTH) == cActual.get(Calendar.MONTH) && cFiesta.get(Calendar.DAY_OF_MONTH) == cActual.get(Calendar.DAY_OF_MONTH)) { isFiesta = true; } } if(!isFiesta) { acceptedHolidays++; } } cActual.add(Calendar.DAY_OF_MONTH, 1); } } uhs.setTotalAccepted(acceptedHolidays); Calendar calAuxCont = Calendar.getInstance(); calAuxCont.setTime(uhs.getUser().getStartDate()); Calendar calAux = Calendar.getInstance(); calAux.setTime(chargeYear); int yearCharge = calAux.get(Calendar.YEAR); int yearContract = calAuxCont.get(Calendar.YEAR); if(yearCharge == yearContract) { // Dividimos los días de cada usuario entre los meses del año. double ratio = uhs.getUser().getAgreement().getHolidays() / 12.0; int monthContract = calAuxCont.get(Calendar.MONTH); int meses = (Calendar.DECEMBER - monthContract); double diasVacaciones = meses * ratio; double aux=Math.ceil(diasVacaciones); uhs.setTotalYear((int)aux); } } return uhs; } /** * @return Devuelve el número de dias de vacaciones que le quedan a un usuario en un año */ public int getFreeDays(User user, Date year) { UserHolidaysState state = this.calcUserHolidaysState(user, year); return state.getTotalYear() - state.getTotalAccepted(); } }