/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package beans.shedule.exceptions;
import framework.beans.SecuredBean;
import framework.beans.security.BeanRights;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import framework.generic.ClipsServerException;
import javax.ejb.Stateful;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import beans.UserRightsSet;import beans.directory.lpu.entity.Lpu;
import beans.user.collaborator.entities.Collaborator;
import framework.security.RightChecker;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
/**
* Бин контролирующий работу исключительных дней, к коим относятся
* незапланированные праздники, предпраздничные дни, вынужденные дни
* простоя предприятия и тд
* @security OK
* Для просмотра права не нужны
* Для редактирования нужно право MODIFY_SHEDULE_EXCEPTIONS
* @author axe
*/
@Stateful(mappedName="clips-beans/SheduleExceptionBean")
public class SheduleExceptionBean extends SecuredBean
implements SheduleExceptionBeanRemote {
public static int COMMAND_MODIFY = 0;
@Override
protected void initBeanRights() {
int[] r = new int[1];
r[COMMAND_MODIFY] = RightPresence(UserRightsSet.MODIFY_SHEDULE_EXCEPTIONS.id);
rights = new BeanRights(r);
}
/**
* Возвращает список исключительных дней для заданного месяца
* @param month месяц (1-12)
* @param year год (1900-2100)
* @return ArrayList<SheduleHolidayDayDetails>
* @security Нет ограничений
*/
@SuppressWarnings("unchecked")
@Override
public List<SheduleExceptionDetails> getExceptionList(int month, int year) throws ClipsServerException {
Calendar cal = GregorianCalendar.getInstance();
cal.set(Calendar.YEAR, year);
cal.set(Calendar.MONTH, month-1);
cal.set(Calendar.DAY_OF_MONTH, 1);
cal = initCalendar(cal.getTime());
Lpu lpu = findEntity(Collaborator.class, getCollaboratorId()).getLpu();
Date begin = cal.getTime();
cal.add(Calendar.MONTH, 1);
Date end = cal.getTime();
Field f[] = {
new Field("day", begin, Field.OPERATOR_EQUAL_OR_MORE),
new Field("day", end, Field.OPERATOR_LESS),
new Field("lpu", lpu),
};
Iterator res = findEntityList(SheduleException.class, f, " ORDER By a.day").iterator();
ArrayList<SheduleExceptionDetails> list = new ArrayList<SheduleExceptionDetails>();
if(res.hasNext()) {
while(res.hasNext()) {
SheduleException sx = (SheduleException) res.next();
list.add(sx.getDetails((RightChecker) this));
}
}
return list;
}
private static Calendar initCalendar(Date day) {
Calendar cal = GregorianCalendar.getInstance();
cal.setTime(day);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
return cal;
}
/**
* Удаляет исключение в заданный день, день должен быть текущим или будущим, по
* отнощению к текущему времени сервера
* @param day день (1-31)
* @param month месяц (1-12)
* @param year год (1900-2100)
* @throws generic.ClipsServerException
* @security Вызывающий должен иметь право MODIFY_SHEDULE_EXCEPTIONS
*/
@TransactionAttribute(TransactionAttributeType.REQUIRED)
@Override
public void removeException(Date day) throws ClipsServerException {
checkCommandAccessibility(COMMAND_MODIFY);
checkIsNotInThePast(day);
Lpu lpu = findEntity(Collaborator.class, getCollaboratorId()).getLpu();
Calendar cal = initCalendar(day);
Date begin = cal.getTime();
cal.add(Calendar.DAY_OF_MONTH, 1);
Date end = cal.getTime();
Field f[] = {
new Field("day", begin, Field.OPERATOR_EQUAL_OR_MORE),
new Field("day", end, Field.OPERATOR_LESS),
new Field("lpu", lpu),
};
deleteEntityList(SheduleException.class, f);
}
/**
* Создает исключение в указанный день, день должен быть текущим или будущим, по
* отнощению к текущему времени сервера
* @param day день (1-31)
* @param month месяц (1-12)
* @param year год (1900-2100)
* @param working true - рабочий день, false - нерабочий
* @param desc описание исключения
* @param timeBegin время начала смены если рабочий день. 0 - если время
* начала смены не изменено.
* @param timeEnd время конца смены если рабочий день. 0 - если время
* конца смены не изменено.
* @throws ClipsServerException
* @security Вызывающий должен иметь право MODIFY_SHEDULE_EXCEPTIONS
*/
@TransactionAttribute(TransactionAttributeType.REQUIRED)
@Override
public int setException(Date day, boolean working, String desc,
int timeBegin, int duration) throws ClipsServerException {
checkCommandAccessibility(COMMAND_MODIFY);
checkIsNotInThePast(day);
Lpu lpu = findEntity(Collaborator.class, getCollaboratorId()).getLpu();
Calendar cal = initCalendar(day);
Date begin = cal.getTime();
cal.add(Calendar.DAY_OF_MONTH, 1);
Date end = cal.getTime();
Field f[] = {
new Field("day", begin, Field.OPERATOR_EQUAL_OR_MORE),
new Field("day", end, Field.OPERATOR_LESS),
new Field("lpu", lpu),
};
Iterator res = findEntityList(SheduleException.class, f).iterator();
SheduleException sx = null;
if(res.hasNext()) {
sx = (SheduleException) res.next();
} else {
sx = new SheduleException();
sx.setDay(begin);
}
sx.setDesc(desc);
sx.setWorking(working);
sx.setBegin(timeBegin);
sx.setDuration(duration);
sx.setLpu(lpu);
int id = saveEntity(sx);
return id;
}
}