/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package clips.delegate.shedule;
import TimeTable.Day;
import TimeTable.DayOfWeek;
import beans.shedule.week.TimeOffset;
import cli_fmw.main.ClipsException;
import cli_fmw.utils.IteratorEditable;
import clips.delegate.directory.ro.DirectoryCollaboratorItem;
import clips.delegate.shedule.exception.SheduleExceptionData;
import clips.delegate.shedule.exception.SheduleExceptionLocal;
import clips.delegate.shedule.holidays.SheduleHolidayData;
import clips.delegate.shedule.holidays.SheduleHolidayLocal;
import clips.delegate.shedule.individual.SheduleIndividualData;
import clips.delegate.shedule.individual.SheduleIndividualLocal;
import clips.delegate.shedule.individual.WeekIndex;
import clips.delegate.shedule.prorumble.SheduleProrumbleData;
import clips.delegate.shedule.prorumble.SheduleProrumbleLocal;
import clips.delegate.shedule.week.SheduleWeekLocal;
import java.util.LinkedList;
import java.util.List;
/**
*
* @author axe
*/
public class SheduleHelper {
private final SheduleWeekLocal swl = SheduleWeekLocal.getInstance();
private final SheduleExceptionLocal sel = SheduleExceptionLocal.getInstance();
private final SheduleHolidayLocal shl = SheduleHolidayLocal.getInstance();
private final SheduleProrumbleLocal spl;
private final SheduleIndividualLocal sil;
public SheduleHelper(SheduleProrumbleLocal spl, SheduleIndividualLocal sil) throws ClipsException {
this.spl = spl;
this.sil = sil;
}
public SheduledDay getSheduledDay(Day day) throws ClipsException {
SheduledDay res = new SheduledDay();
//week
DayOfWeek dow = day.getDayOfWeek();
TimeOffset timeBegin = swl.getTimeBegin(dow);
res.setClinicShiftBegin(timeBegin);
res.setClinicShiftDuration(swl.getTimeEnd(dow).getRaw() - timeBegin.getRaw());
//Возможно выходной
if (res.getClinicShiftDuration() == 0) {
res.setWorking(false);
res.setDescription("Выходной");
return res;
}
//prorumble
SheduleProrumbleData prorumble = spl.getProrumble(day);
if (prorumble != null) {
res.setWorking(false);
res.setDescription(prorumble.toString());
res.setProrumbleItem(prorumble.getType());
return res;
}
//Получаем расписание врача за текущую неделю (только работы указанного типа)
//если нет работ - значит врач работает по шаблону, идем дальше
WeekIndex weekIndex = new WeekIndex(day);
IteratorEditable<SheduleIndividualData> exWorks = sil.daySelector(weekIndex, dow);
if (exWorks.hasNext()) {
res.setWorking(true);
res.setDescription("Исключение");
//если есть работы используем их
List<SheduleIndividualData> lst = new LinkedList<SheduleIndividualData>();
while (exWorks.hasNext()) {
lst.add(exWorks.next());
}
res.setData(lst);
return res;
}
//5. Получаем исключения работы поликлинники за текущую неделю.
//если исключения есть, и они указывают что день нерабочий, отмечаем день как закрытый
SheduleExceptionData exception = sel.getException(day.getCalendar().getTime());
if (exception != null && !exception.isWorking()) {
res.setWorking(false);
res.setDescription(exception.getDescription());
return res;
}
//6. Если исключений нет, получаем праздники за указанную неделю
//если в этот день праздник, отмечаем день как закрытый
if (exception == null) {
SheduleHolidayData holiday = shl.getHoliday(day.getDay(), day.getMonth() + 1);
if (holiday != null) {
res.setWorking(false);
res.setDescription(holiday.getDescription());
return res;
}
}
//7. Врач работает по шаблону. получаем шаблон расписания для данного врача
res.setWorking(true);
res.setByPlan(true);
WeekIndex planWeekIndex = new WeekIndex(weekIndex.getIndex() % sil.getWeekCount());
IteratorEditable<SheduleIndividualData> plWorks = sil.daySelector(planWeekIndex, dow);
if (plWorks.hasNext()) {
//если есть работы используем их
List<SheduleIndividualData> lst = new LinkedList<SheduleIndividualData>();
while (plWorks.hasNext()) {
lst.add(plWorks.next());
}
res.setData(lst);
}
return res;
}
}