/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package web.operator;
import domain.Client;
import domain.Collaborator;
import domain.District;
import domain.Lpu;
import domain.editors.Editor;
import domain.shedule.WorkType;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.hibernate.criterion.CriteriaSpecification;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Property;
import org.hibernate.criterion.Restrictions;
import org.springframework.validation.BindException;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.servlet.ModelAndView;
import utils.Day;
import utils.WeekIndex;
import web.generic.CH;
import web.generic.GenericCommandController;
import web.rechelper.IncomingParamsValidator;
import web.rechelper.ReceptionDTO;
import web.rechelper.ReceptionHelper;
import web.rechelper.Ticket;
import web.rechelper.WeekDay;
/**
* Контроллер выбора врача оператором при записи на прием
* Обязательные параметры:
* lpu - ID лечебно-профилактического учреждения
* Необязательные параметры:
* collaborator - ID сотрудника
* type - ID приема
* @author lacoste
*/
public class CollaboratorController extends GenericCommandController {
public CollaboratorController() {
setCommandClass(CollaboratorDTO.class);
}
@Override
protected void onBind(HttpServletRequest request, Object command, BindException errors) throws Exception {
CollaboratorDTO dto = (CollaboratorDTO) super.getCommand(request);
if(dto.getCollaborator() != null) {
Collaborator collab = dto.getCollaborator();
dto.setSurname(collab.getClient().getSurname().getTitle());
dto.setName(collab.getClient().getName().getTitle());
dto.setPatron(collab.getClient().getPatronymic().getTitle());
}
}
@Override
protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
binder.registerCustomEditor(WorkType.class, new Editor(getDao(), WorkType.class));
binder.registerCustomEditor(Lpu.class, new Editor(getDao(), Lpu.class));
binder.registerCustomEditor(Client.class, new Editor(getDao(), Client.class));
binder.registerCustomEditor(Collaborator.class, new Editor(getDao(), Collaborator.class));
binder.registerCustomEditor(District.class, new Editor(getDao(), District.class));
}
@Override
protected ModelAndView handle(HttpServletRequest request,
HttpServletResponse response, Object command, BindException errors) throws Exception {
Lpu lpu = CH.getOptional(getDao(), Lpu.class, request.getParameter("lpu"));
if (lpu == null) {
return IncomingParamsValidator.redirectTo("/operator/index.htm", null, null, lpu, null);
}
CollaboratorDTO dto = (CollaboratorDTO) command;
HashMap model = new HashMap();
DetachedCriteria queryCriteria = null;
if (dto.getType() != null) {
queryCriteria = DetachedCriteria.forClass(Collaborator.class)
.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
queryCriteria.add(Property.forName("lpu").eq(dto.getLpu()))
.createCriteria("sheduleIndividualCollection")
.add(Property.forName("workType").eq(dto.getType()));
} else {
Calendar cal = Calendar.getInstance();
Date begin = cal.getTime();
cal.add(Calendar.DAY_OF_YEAR, 14);
Date end = cal.getTime();
cal.set(2007, 0, 1, 0, 0, 0);
Date date2007Begin = cal.getTime();
cal.add(Calendar.MONTH, 1);
Date date2007End = cal.getTime();
queryCriteria = DetachedCriteria.forClass(Collaborator.class)
.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
queryCriteria.add(Property.forName("lpu").eq(dto.getLpu()))
.createCriteria("sheduleIndividualCollection")
.add( Restrictions.disjunction()
.add (Restrictions.conjunction()
.add( Restrictions.ge("timeBegin", date2007Begin ) )
.add( Restrictions.le("timeBegin", date2007End ) )
)
.add (Restrictions.conjunction()
.add( Restrictions.ge("timeBegin", begin ) )
.add( Restrictions.le("timeBegin", end ) )
)
)
.createCriteria("workType")
.add(Property.forName("available").eq(Boolean.TRUE));
}
if((dto.getSurname() != null && !dto.getSurname().isEmpty())
|| (dto.getName() != null && !dto.getName().isEmpty())
|| (dto.getPatron() != null && !dto.getPatron().isEmpty())) {
DetachedCriteria colls = queryCriteria
.createCriteria("client");
if(dto.getSurname() != null && !dto.getSurname().isEmpty()) {
colls.createCriteria("surname")
.add(Property.forName("title").like(dto.getSurname() + "%").ignoreCase());
}
if(dto.getName() != null && !dto.getName().isEmpty()) {
colls.createCriteria("name")
.add(Property.forName("title").like(dto.getName()+ "%").ignoreCase());
}
if(dto.getPatron() != null && !dto.getPatron().isEmpty()) {
colls.createCriteria("patronymic")
.add(Property.forName("title").like(dto.getPatron()+ "%").ignoreCase());
}
}
List<Collaborator> collabs = getDao().getList(queryCriteria, null, null);
List<CollabWorkTypeDTO> collabWorks = new LinkedList<CollabWorkTypeDTO>();
List<WorkType> works;
for (Collaborator collab : collabs) {
works = getDao().getWorksByCollaborator(collab);
for (WorkType work : works) {
CollabWorkTypeDTO collabWork = new CollabWorkTypeDTO();
collabWork.setWorkType(work);
collabWork.setCollaborator(collab);
collabWorks.add(collabWork);
}
}
List<WorkType> workTypes = getDao().getList(WorkType.class);
Map<CollabWorkTypeDTO, Ticket> collabTicketMap = new HashMap<CollabWorkTypeDTO, Ticket>();
for (CollabWorkTypeDTO collabWorkTypeDTO : collabWorks) {
ReceptionDTO rdto = new ReceptionDTO();
rdto.setCollaborator(collabWorkTypeDTO.getCollaborator());
rdto.setLpu(lpu);
rdto.setType(collabWorkTypeDTO.getWorkType());
Day day = new Day(new Date());
Date dateStart = day.getDate();
Calendar calendar = day.getCalendar();
calendar.add(Calendar.DAY_OF_MONTH, 13);
day = new Day(calendar);
Date dateEnd = day.getEndDate();
ReceptionHelper rh = new ReceptionHelper(getDao(), rdto, dateStart, dateEnd);
List<WeekDay> wModel = rh.getModel();
for (int i = 0; i < wModel.size() && collabTicketMap.get(collabWorkTypeDTO) == null; i++) {
WeekDay weekDay = wModel.get(i);
List<Ticket> tickets = weekDay.getTickets();
if (tickets != null){
for (Ticket ticket : tickets) {
if (!ticket.isBuzy()){
collabTicketMap.put(collabWorkTypeDTO, ticket);
break;
}
}
}
}
}
model.put("tickets", collabTicketMap);
model.put("command", dto);
model.put("client", dto.getClient());
model.put("collabworks", collabWorks);
model.put("workTypes", workTypes);
model.put("pageBreadcrumb", ReceptionController.initBreadCrumb(dto.getClient(),
dto.getType(),
dto.getLpu(),
dto.getCollaborator(),
dto.getTime()));
return new ModelAndView("operator/collaborator", model);
}
}