/*
* Copyright (c) 2005-2011 Grameen Foundation USA
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.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.
*
* See also http://www.apache.org/licenses/LICENSE-2.0.html for an
* explanation of the license and how it is applied.
*/
package org.mifos.application.holiday.business.service;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import org.joda.time.DateTime;
import org.mifos.application.holiday.business.HolidayBO;
import org.mifos.application.holiday.persistence.HolidayDao;
import org.mifos.application.holiday.util.helpers.HolidayConstants;
import org.mifos.config.FiscalCalendarRules;
import org.mifos.customers.office.business.OfficeBO;
import org.mifos.customers.office.persistence.OfficeDao;
import org.mifos.dto.domain.HolidayDetails;
import org.mifos.framework.hibernate.helper.HibernateTransactionHelper;
import org.mifos.service.BusinessRuleException;
import org.springframework.beans.factory.annotation.Autowired;
public class HolidayServiceImpl implements HolidayService {
private final OfficeDao officeDao;
private final HolidayDao holidayDao;
private final HibernateTransactionHelper hibernateTransactionHelper;
private final FiscalCalendarRules fiscalCalendarRules;
@Autowired
public HolidayServiceImpl(OfficeDao officeDao, HolidayDao holidayDao,
HibernateTransactionHelper hibernateTransactionHelper,
FiscalCalendarRules fiscalCalendarRules) {
this.officeDao = officeDao;
this.holidayDao = holidayDao;
this.hibernateTransactionHelper = hibernateTransactionHelper;
this.fiscalCalendarRules = fiscalCalendarRules;
}
@Override
public void create(HolidayDetails holidayDetails, List<Short> officeIds) {
HolidayBO holiday = HolidayBO.fromDto(holidayDetails);
holiday.validate();
List<OfficeBO> offices = new ArrayList<OfficeBO>();
for (Short officeId : officeIds) {
OfficeBO office = officeDao.findOfficeById(officeId);
offices.add(office);
if (office.hasChildWithAnyOf(officeIds)) {
throw new BusinessRuleException(HolidayConstants.HOLIDAY_CREATION_EXCEPTION);
// "Holidays can only be associated with one level of office in an office hierarchy."
}
}
try {
hibernateTransactionHelper.startTransaction();
this.holidayDao.save(holiday);
for (OfficeBO office : offices) {
office.addHoliday(holiday);
}
hibernateTransactionHelper.commitTransaction();
} catch (Exception e) {
hibernateTransactionHelper.rollbackTransaction();
} finally {
hibernateTransactionHelper.closeSession();
}
}
@Override
public boolean isWorkingDay(Calendar day, Short officeId) {
return (fiscalCalendarRules.isWorkingDay(day)) && !holidayDao.isHoliday(officeId, getLocaleDate(day));
}
private String getLocaleDate(Calendar day) {
return new DateTime(day.getTime().getTime()).toLocalDate().toString();
}
@Override
public Calendar getNextWorkingDay(Calendar day, Short officeId) {
while (!isWorkingDay(day, officeId)) {
day.add(Calendar.DATE, 1);
}
return day;
}
@Override
public Date getNextWorkingDay(Date day, Short officeId) {
return getNextWorkingDay(getCalendarDate(day), officeId).getTime();
}
@Override
public boolean isFutureRepaymentHoliday(Calendar date, Short officeId) {
return isRegularHoliday(date) || holidayDao.isFutureRepaymentHoliday(officeId, getLocaleDate(date));
}
private boolean isRegularHoliday(Calendar date) {
return !fiscalCalendarRules.isWorkingDay(date);
}
private static Calendar getCalendarDate(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar;
}
}