/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package beans.shedule.week;
import framework.beans.SecuredBean;
import framework.beans.security.BeanRights;
import framework.generic.ClipsServerException;
import java.util.ArrayList;
import java.util.Iterator;
import javax.ejb.Stateful;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import beans.UserRightsSet;
import beans.user.collaborator.entities.Collaborator;
import java.util.HashSet;
import java.util.List;
/**
* Бин для управления еженедельным расписанием клиники
* @security ok
* @author axe
*/
@Stateful(mappedName="clips-beans/SheduleWeekBean")
public class SheduleWeekBean extends SecuredBean
implements SheduleWeekBeanRemote {
public static int COMMAND_MODIFY = 0;
@Override
protected void initBeanRights() {
int[] r = new int[1];
r[COMMAND_MODIFY] = RightPresence(UserRightsSet.MODIFY_SHEDULE_WEEK.id);
rights = new BeanRights(r);
}
/**
* Возвращает информацию о днях недели,
* дублирующиеся данные (строки с одинаковым индексом дня) удаляются.
* @return SheduleWeekDetails - данные по еженедельному расписанию клиники
* @throws ClipsServerException
* @security без ограничений
*/
@Override
public List<DayShift> getDetails() throws ClipsServerException {
Collaborator collab = findEntity(Collaborator.class, getCollaboratorId());
Iterator<SheduleWeek> list = findEntityList(SheduleWeek.class, "lpu", collab.getLpu()).iterator();
ArrayList<DayShift> result = new ArrayList<DayShift>();
for(int i=0; i<7; i++) {
result.add(null);
}
while(list.hasNext()) {
SheduleWeek swp = list.next();
Integer dayIndex = swp.getDayIndex();
if(dayIndex<0 || dayIndex>6) {
throw new ClipsServerException("Некорректные данные о недельном расписании в БД");
}
if(result.get(dayIndex) != null) {
manager.remove(swp);
} else {
TimeOffset shiftBegin = new TimeOffset(swp.getBegin());
TimeOffset shiftEnd = new TimeOffset(swp.getEnd());
DayShift dayShift = new DayShift(shiftBegin, shiftEnd);
result.set(dayIndex, dayShift);
}
}
//add missing days
for(int i=0; i<7; i++) {
DayShift dayShift = result.get(i);
if(dayShift == null) {
dayShift = new DayShift();
result.set(i, dayShift);
SheduleWeek swp = new SheduleWeek();
swp.setDayIndex(i);
swp.setBegin(0);
swp.setEnd(0);
swp.setLpu(collab.getLpu());
manager.persist(swp);
}
}
return result;
}
/**
* Назначает время работы клиники на заданный день недели
* @param dayOfWeek день недели (константы java)
* @param timeBegin время начала работы, количество минут с начала суток
* @param timeEnd время окончания работы, количество минут с начала суток
* @security требуется право MODIFY_SHEDULE_WEEK
*/
@TransactionAttribute(TransactionAttributeType.REQUIRED)
@Override
public void setTime(int dayOfWeek, TimeOffset timeBegin, TimeOffset timeEnd)
throws ClipsServerException {
if(dayOfWeek <0 || dayOfWeek >6) {
throw new IllegalArgumentException("Day of week = " + dayOfWeek);
} else if (timeBegin.compareTo(timeEnd) > 0) {
throw new IllegalArgumentException("TimeEnd < TimeBegin ("
+ timeEnd + " < " + timeBegin + ")");
}
checkCommandAccessibility(COMMAND_MODIFY);
Collaborator collab = findEntity(Collaborator.class, getCollaboratorId());
SheduleWeek swp = null;
Field f[] = {
new Field("dayIndex", dayOfWeek),
new Field("lpu", collab.getLpu()),
};
Iterator<SheduleWeek> list = findEntityList(SheduleWeek.class, f).iterator();
//delete dublicates
if(list.hasNext()) {
swp = list.next();
while(list.hasNext()) {
SheduleWeek week = list.next();
manager.remove(week);
}
}
if(swp == null) {
swp = new SheduleWeek();
swp.setDayIndex(dayOfWeek);
swp.setBegin(timeBegin.getRaw());
swp.setEnd(timeEnd.getRaw());
swp.setLpu(collab.getLpu());
manager.persist(swp);
} else {
swp.setBegin(timeBegin.getRaw());
swp.setEnd(timeEnd.getRaw());
swp.setLpu(collab.getLpu());
manager.merge(swp);
}
}
}