/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package beans.shedule.prorumble;
import beans.directory.simple.entities.ProrumbleType;
import framework.beans.FindEntity.Field;
import framework.beans.SecuredBean;
import framework.beans.security.BeanRights;
import beans.user.collaborator.entities.Collaborator;
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 framework.security.RightChecker;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
/**
* Бин контролирует списки прогулов и отпусков сотрудников
* @security ok
* @author axe
*/
@Stateful(mappedName="clips-beans/SheduleProrumbleBean")
public class SheduleProrumbleBean extends SecuredBean
implements SheduleProrumbleBeanRemote {
public static int COMMAND_MODIFY = 0;
@Override
protected void initBeanRights() {
int[] r = new int[1];
r[COMMAND_MODIFY] = RightPresence(UserRightsSet.MODIFY_PRORUMBLE.id);
rights = new BeanRights(r);
}
/**
* Возвращает список прогулов и отпусков сотрудника, за указанный месяц
* @param collid идентификатор сотрудника
* @param month 1-12 месяц
* @param year 1900-2100 год
* @return список прогулов и отпусков
* @security без ограничений
*/
@SuppressWarnings("unchecked")
@Override
public List<ProrumbleDetails> getProrumbleList(int collid, int month, int year) throws ClipsServerException {
if(month < 1 || month > 12
|| year < 1900 || year > 2100) {
throw new IllegalArgumentException("Date ЧЧ.mm.yyyy: ХХ."
+ "." + month + "." + year);
}
Calendar begin = getCalendar(1, month, year);
Calendar end = (Calendar) begin.clone();
end.add(Calendar.MONTH, 1);
Field f[] = {
new Field("collaborator", findEntity(Collaborator.class, collid)),
new Field("day", begin.getTime(), Field.OPERATOR_EQUAL_OR_MORE),
new Field("day", end.getTime(), Field.OPERATOR_LESS)
};
Iterator res = findEntityWhat(null, Prorumble.class, f, "ORDER By a.day").iterator();
ArrayList<ProrumbleDetails> list = new ArrayList<ProrumbleDetails>();
if(res.hasNext()) {
while(res.hasNext()) {
Prorumble sx = (Prorumble) res.next();
list.add(sx.getDetails((RightChecker) this));
}
}
return list;
}
/**
* Назначается день отпуска или прогула
* @param details
* @throws generic.ClipsServerException
* @security вызывающий должен иметь право MODIFY_PRORUMBLE, дата указанная
* в деталях должна быть сегодняшней или в будущем
*/
@TransactionAttribute(TransactionAttributeType.REQUIRED)
@Override
public void setProrumble(ProrumbleDetails details) throws ClipsServerException {
//rights
checkCommandAccessibility(COMMAND_MODIFY);
//ODZ
if(details.day < 1 || details.day > 31
|| details.month < 1 || details.month > 12
|| details.year < 1900 || details.year > 2100) {
throw new IllegalArgumentException("Date dd.mm.yyyy:"
+ details.day + ":" + details.month + ":" + details.year);
}
List<Prorumble> list = getProrumbleList(details.day,
details.month, details.year, details.collID);
Prorumble sx = null;
if(list.size() > 0) {
sx = (Prorumble) list.get(0);
sx.setType(findEntity(ProrumbleType.class, details.type));
manager.merge(sx);
} else {
sx = new Prorumble();
sx.setDay(getCalendar(details.day, details.month, details.year).getTime());
sx.setCollaborator(findEntity(Collaborator.class, details.collID));
sx.setType(findEntity(ProrumbleType.class, details.type));
manager.persist(sx);
}
}
/**
* Удаляет запись о прогуле или отпске
* @param collid сотрудник
* @param day 1-31 день
* @param month 1-12 месяц
* @param year 1900-2100 год
* @security вызывающий должен иметь право MODIFY_PRORUMBLE, дата указанная
* в деталях должна быть сегоднящней или в будущем
*/
@TransactionAttribute(TransactionAttributeType.REQUIRED)
@Override
public void removeProrumble(int collid, int day, int month, int year) throws ClipsServerException {
checkCommandAccessibility(COMMAND_MODIFY);
if(day < 1 || day > 31
|| month < 1 || month > 12
|| year < 1900 || year > 2100) {
throw new IllegalArgumentException("Date dd.mm.yyyy:"
+ day + ":" + month + ":" + year);
}
for(Prorumble pro:getProrumbleList(day, month, year, collid)) {
removeEntity(pro);
}
}
/**
*
* @param day
* @param month
* @param year
* @param collid
* @return
* @throws framework.generic.ClipsServerException
*/
private List<Prorumble> getProrumbleList(int day, int month, int year, int collid) throws ClipsServerException {
Calendar begin = getCalendar(day, month, year);
checkIsNotInThePast(begin);
Calendar end = (Calendar) begin.clone();
end.add(Calendar.DAY_OF_MONTH, 1);
Field[] f = {
new Field("collaborator", findEntity(Collaborator.class, collid)),
new Field("day", begin.getTime(), Field.OPERATOR_EQUAL_OR_MORE),
new Field("day", end.getTime(), Field.OPERATOR_LESS)
};
return findEntityWhat(null, Prorumble.class, f, "");
}
/**
*
* @param day 1-31
* @param month 1-12
* @param year 2007-
* @return
*/
private static Calendar getCalendar(int day, int month, int year) {
Calendar cal = GregorianCalendar.getInstance();
cal.set(Calendar.YEAR, year);
cal.set(Calendar.MONTH, month - 1);
cal.set(Calendar.DAY_OF_MONTH, 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;
}
}